数组的索引与切片
多维数组的索引
1 import numpy as np 2 arr=np.arange(1,25).reshape(2,3,4) 3 arr 4 # 输出 array([[[ 1, 2, 3, 4], 5 [ 5, 6, 7, 8], 6 [ 9, 10, 11, 12]], 7 8 [[13, 14, 15, 16], 9 [17, 18, 19, 20], 10 [21, 22, 23, 24]]]) 11 arr[1][2][3] 12 # 输出24 13 arr[1,2,3] # 与arr[1][2][3]结果一样 14 # 输出24 15 16 arr[0,0:2,1:3] 17 # 输出array([[2, 3], 18 [6, 7]]) 19 arr[0][0:2][1:3] # 与arr[0,0:2,1:3]结果不一样 20 # 输出array([[5, 6, 7, 8]]) 21 22 arr[0,1:2,1:3] 23 # 输出array([[6, 7]]) 24 arr[0][0:2][1][1:3] # 这样与arr[0,1:2,1:3]结果才能达到一致 25 # 输出array([6, 7])
2. NumPy中的数组的切片
3. 布尔型索引
1 # 接上一个代码 2 arr>6 3 # 输出array([[[False, False, False, False], 4 [False, False, True, True], 5 [ True, True, True, True]], 6 7 [[ True, True, True, True], 8 [ True, True, True, True], 9 [ True, True, True, True]]]) 10 11 arr[arr>6] 12 # 输出array([ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
4. 花式索引
1 import numpy as np 2 arr1 = np.arange(32).reshape(8,4) 3 # 输出 array([[ 0, 1, 2, 3], 4 [ 4, 5, 6, 7], 5 [ 8, 9, 10, 11], 6 [12, 13, 14, 15], 7 [16, 17, 18, 19], 8 [20, 21, 22, 23], 9 [24, 25, 26, 27], 10 [28, 29, 30, 31]]) 11 12 arr1[[0,3,5],[0,3,2]] # 前一个取出行,后一个按位取出对应的列 13 # 输出 array([ 0, 15, 22]) 14 15 arr1[[0,3,5]] 16 # 输出 array([[ 0, 1, 2, 3], 17 [12, 13, 14, 15], 18 [20, 21, 22, 23]]) 19 20 arr1[np.ix_([0,3,5],[0,2,1,3])] # [0,2,1,3]可以改变列的位置 21 # 输出 array([[ 0, 2, 1, 3], 22 [12, 14, 13, 15], 23 [20, 22, 21, 23]]) 24
数组转置与轴对换
1. transpose函数用于数组转置,对于二维数组来说就是行列互换
2. 数组的T属性,也是转置
arr1 = arr.T与arr2=arr.transpose()效果一样
通用函数:快速的元素级数组函数
ufunc:一种对ndarray中的数据执行元素级运算的函数,也可以看作是简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装起
一元ufunc | 说明 |
abs,fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs |
sqrt | 计算各元素的平方根,相当于arr**0.5 |
square | 计算各元素的平方,相当于arr**2 |
exp | 计算各元素的指数e的x次方 |
log,log10log2 log1p | 分别为自然对数、底数是10的log,底数为2的log,log(1+x) |
sign | 计算各元素的正负号:1正数,0零,-1负数 |
cell | 计算各元素的ceiling值,即大于等于该值的最小整数 |
floor | 计算各元素的floor值,即小于等于该值的最大整数 |
rint | 将各元素值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数位和整数部分以两个独立数组的形式返回 |
isnan | 返回一个表示“哪些值是NaN(不是一个数字)”的布尔类型数组 |
isfinite,isinf | 分别返回一个表示“哪些元素是有穷的(非inf,非NaN)”或“哪些元素是无穷的”的布尔型数组 |
cos,cosh,sin sinh,tan,tanh | 普通型和双曲型三角函数 |
arccos,arccosh, arcsin,arctan, arctanh | 反三角函数 |
logical_not | 计算各元素not x的真值,相当于~和-arr |
add | 将数组中相同位置对应的元素相加 |
substract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide,floor_divive | 除法或者向下圆整除法(丢弃余数) |
pow | 对第一个数组中的元素A,根据第二个数组中的相应元素B,计算A的B次方 |
maximum,fmax | 元素级别的最大值,fmax会忽略NaN |
minimum,fmin | 元素级别的最小值,fmin会忽略NaN |
mod | 元素级的求模(除法的余数) |
copysign | 将第二个数组中的值的符号复制给第一个数组中的对应位置的值 |
greater, greater_equal,less less_equal,equal not_equal | 执行元素级别的比较运算,最终产生布尔型数组 |
logical_and, logical_or, logical_xor | 执行元素级别的布尔逻辑运算,相当于中缀运算符&、|、^ |
聚合函数
1. 聚合函数是对一组值(比如一个数组)进行操作,返回一个单一值作为结果的函数。因此求数组所有元素之和、求所有元素的最大最小值以及标准差的函数就是聚合函数
arr.max() arr.min() arr.mean()
arr.std()标准差,相当于np.sqrt(np.power(arr-arr.mean(),2).sum()/arr.size)
2. 聚合函数可以指定对数值的某个轴元素进行操作
arr.mean(axis=0)对每一列取均值 arr.mean(axis=1)对每一行取均值
axis=0时对同一列上的元素进行聚合 axis=1时对同一行上的元素进行聚合
np.where函数
1. np.where函数是三元表达式x if condition else y 的矢量化版本
1 import numpy as np 2 xarr=np.array([1.1,1.2,1.3,1.4,1.5]) 3 yarr=np.array([2.1,2.2,2.3,2.4,2.5]) 4 condition=np.array([True,False,True,True,False]) 5 result=[(x if c else y) for x,y,c in zip(xarr,yarr,condition)] 6 result 7 # 输出 [1.1, 2.2, 1.3, 1.4, 2.5] 8 result2=np.where(condition,xarr,yarr) 9 result2 10 # 输出 array([1.1, 2.2, 1.3, 1.4, 2.5])
2. 案例:将数组中所有NaN缺失值替换为0
1 import numpy as np 2 arr=np.array([[1,2,np.NaN,4],[3,4,5,np.NaN]]) 3 arr 4 # 输出array([[ 1., 2., nan, 4.], 5 [ 3., 4., 5., nan]]) 6 np.isnan(arr) 7 # 输出array([[False, False, True, False], 8 [False, False, False, True]]) 9 np.where(np.isnan(arr),0,arr) 10 # 输出array([[1., 2., 0., 4.], 11 [3., 4., 5., 0.]])
np.unique函数
求数组中不重复的元素
1 import numpy as np 2 pd=np.array(['图书','数码','小吃','美食','男装','美食','女装','小吃']) 3 np.unique(pd) 4 # 输出 array(['图书', '女装', '小吃', '数码', '男装', '美食'], dtype='<U2')
数组数据文件读写
1. 将数组以二进制格式保存到磁盘
1 import numpy as np 2 data = np.array([[1,2,3,4],[2,3,4,5],[6,7,8,9],[2,3,4,6]]) 3 data 4 # 输出 array([[1, 2, 3, 4], 5 [2, 3, 4, 5], 6 [6, 7, 8, 9], 7 [2, 3, 4, 6]]) 8 np.save('data',data) # 将多维数组存储到文件,自动添加后缀.npy (二进制文件) 9 np.load('data.npy') # 读取文件需要添加对应的后缀 10 # 输出 array([[1, 2, 3, 4], 11 [2, 3, 4, 5], 12 [6, 7, 8, 9], 13 [2, 3, 4, 6]])
2. 存取文本文件
1 import numpy as np 2 exp = np.loadtxt('example.csv',delimiter=',') 3 exp 4 # 输出array([[1., 2., 3., 4.], 5 [2., 4., 5., 7.], 6 [4., 1., 5., 9.]]) 7 8 np.genfromtxt('example.csv',delimiter=',') 9 # 输出array([[1., 2., 3., 4.], 10 [2., 4., 5., 7.], 11 [4., 1., 5., 9.]]) 12
3. 数据写入文本文件
1 import numpy as np 2 np.savetxt('arr.csv',exp.reshape((2,6)),delimiter=',',fmt='%.2f') 3 exp2=np.random.random((2,3,4)) 4 # 如果数组为二维以上的数组,则必须转换为二维数组才能进行存储,否则一定会出错 5 np.savetxt('arr1.csv',arr3.reshape((4,6)),delimiter=',')