Numpy:ndarray数据类型和运算

时间:2020-12-26 03:17:49

Numpy的ndarray:一种多维数组对象

N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)

import numpy as np
# 创建ndarry
# 创建数组最简单的方法就是使用array函数,它接受一切序列型的对象
data1 = [6,7.5,8,0,1]
# 然后产生一个新的含有传入数据的NumPy数组
arr1 = np.array(data1)
arr1
array([6. , 7.5, 8. , 0. , 1. ])
# 嵌套序列将会被转换为一个多维数组
data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
arr2 array([[1, 2, 3, 4],
[5, 6, 7, 8]]) arr2.shape # 形状 二维数组,每一个维度4个值
(2, 4) # np.array会尝试为新建的这个数组推断出一个较为合适的数据类型,保存在一个特殊的dtype对象中
arr1.dtype
dtype('float64')
arr2.dtype
dtype('int32') # 除np.array之外,还有一些函数也可以新建数组 # 见词知意,新建10个全是0的数组
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) # 见词知意,新建10个全是1的数组
np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) np.zeros((3,5))
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]) # empty不是见名知意了,它返回的都是一些未初始化的垃圾值
np.empty((3,5,2))
array([[[1.22955771e-311, 9.58487353e-322],
[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 5.02034658e+175],
[4.66725104e-062, 4.01832345e-057],
[9.51657595e+169, 3.34722073e-033]], [[1.47763641e+248, 1.16096346e-028],
[7.69165785e+218, 1.35617292e+248],
[3.10139001e+179, 9.15011178e-071],
[1.13823902e-042, 1.33689723e+165],
[4.30420903e-096, 6.32299154e+233]], [[6.48224638e+170, 5.22411352e+257],
[5.74020278e+180, 8.37174974e-144],
[1.41529402e+161, 9.16651763e-072],
[4.10024115e+097, 5.06265680e-038],
[3.75559122e+126, 1.58268989e-319]]])
函数 说明
array 将输入数据(列表、元组、数组或其他序列类型)转为ndarray。要么推断出dtype,要么显式指定dtype
asarray 将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制
arange 类似于内置的range,但返回的是一个ndarray而不是列表
ones、ones_like 根据指定的形状和dtype创建一个全1数组。ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1数组
zeros、zeros_like
empty、empty_like 创建新数组,只分配内存空间但不填充任何值
eye、identity 创建一个正方的N*N单位矩阵(对角线为1,其余为0)
# asarray将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制
np.asarray([1,2,3,4,5])
array([1, 2, 3, 4, 5]) #array将输入数据(列表、元组、数组或其他序列类型)转为ndarray。要么推断出dtype,要么显式指定dtype\
# 指定dtype
arr3 = np.array([1,2,3],dtype = np.float64)
arr3.dtype
dtype('float64')
arr4 = np.array([4,5,6],dtype = np.int32)
arr4.dtype
dtype('int32')

numpy的数据类型

类型 类型代码 说明
int8、uint i1、u1 有符号和无符号的8位整型
int16、uint16 i2、u2 有符号和无符号的16位整型
int32、uint32 i4、u4
int64、uint64 i8、u8
float16 f2 半精度浮点数
float32 f4或f 标准的双精度浮点数
float64 f8或d 标准的双精度浮点数
float128 f16或g 扩展精度浮点数
complex64、complex128、complex256 c8、c16、c32 分别用两个32位、64位或128位浮点数表示的复数
object O Python对象类型
string_ S 固定的长度的字符串类型(每个字符1个字节),例如要创建一个长度为10的字符串,应使用S10
unicode_ U 固定长度的unicode类型(U10)
# 显式转换dtype
arr6 = np.array([1,2,3,4,5])
dtype('int32')
arr6.dtype
dtype('float64') # 如果将浮点数转换成整数,则小数部分将会被截断
arr8 = np.array([3.7,-1.2,2.6,0.5,12.9,10.1])
arr8.dtype
dtype('float64') arr9 = arr8.astype(np.int32)
arr9.dtype
arr9
array([ 3, -1, 2, 0, 12, 10]) # 如果某字符串数组表示的全是数字,也可以转换为数值形式
arr10 = np.array(['1.25','-9.6','42'], dtype = np.string_)
arr10
array([b'1.25', b'-9.6', b'42'], dtype='|S4') arr11 = arr10.astype(np.float32)
arr11
array([ 1.25, -9.6 , 42. ], dtype=float32) # 数组的dytpe另一个用法
int_array = np.arange(10)
int_array
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
calibers = np.array([.22,.270,.357,.44,50],dtype = np.float64)
# 复制类型
int_array.astype(calibers.dtype)
# 调用astype无论如何都会创建一个新的数组(原始数据的一份拷贝),即使dtype跟老dtype相同也是如此
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

数组和标量之间的运算

数组的意义是让你不写循环即可完成数据批量运算,这通常叫矢量化

大小相等的数组之间的任何运算都会将运算应用到元素级

不同大小的数组之间的运算叫做广播

arr12 = np.array([[1.,2.,3.],[4.,5.,6.]])
arr12 array([[1., 2., 3.],
[4., 5., 6.]]) arr12 * arr12 array([[ 1., 4., 9.],
[16., 25., 36.]])
arr12 - arr12 array([[0., 0., 0.],
[0., 0., 0.]]) 1 / arr12 array([[1. , 0.5 , 0.33333333],
[0.25 , 0.2 , 0.16666667]]) arr12 ** 0.5 array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974]])