NumPy使用教程(三)面向数组编程
来自http://www.tpleina.com/2019/05/3281302163.html
面向数组编程
NumPy数组通过简单的数组表达式完成多种数据操作任务,数组表达式代替循环的方法称之为向量化
numpy.where
numpy.where
函数是三目运算x if condition else y
的数组版
使用示例
条件+数组+数组形式
import numpy as np
arr1 = np.random.randn(6)
arr2 = np.random.randn(6)
cond = np.array([True,True,True,False,False,False])
print(arr1)
print(arr2)
arr3 = np.where(cond, arr1, arr2)
print(arr3)
# 输出
[ 1.27341434 0.98277035 -0.37508696 -0.10692764 0.61461728 -0.49524537]
[-0.17197977 -1.54415347 2.10698458 -0.59802743 -0.39001325 1.29582979]
[ 1.27341434 0.98277035 -0.37508696 -0.59802743 -0.39001325 1.29582979]
条件+标量+数组形式
import numpy as np
arr = np.random.randint(-50,50,(4,5))
print(arr)
t_num = 10
arr1 = np.where(arr>0, t_num, arr)
print(arr1)
# 输出
[[-17 29 -39 -42 28]
[ 32 33 49 22 47]
[-22 -36 10 11 24]
[ 30 -29 -1 40 -27]]
[[-17 10 -39 -42 10]
[ 10 10 10 10 10]
[-22 -36 10 10 10]
[ 10 -29 -1 10 -27]]
条件+标量+标量形式
import numpy as np
arr = np.random.randint(-50,50,(4,5))
print(arr)
t_num = 10
f_num = -10
arr1 = np.where(arr>0, t_num, f_num)
print(arr1)
# 输出
[[ 18 47 -16 -50 31]
[ 34 -39 38 -47 -41]
[ 4 -20 41 37 23]
[-15 -48 12 -32 -34]]
[[ 10 10 -10 -10 10]
[ 10 -10 10 -10 -10]
[ 10 -10 10 10 10]
[-10 -10 10 -10 -10]]
数组统计函数
sum
沿着轴向,计算所有元素累积和mean
算数平均数std
、var
标准差、方差min
、max
最大值、最小值argmin
、argmax
最大和最小元素的位置cumsum
从0开始元素累积和cumprod
从1开始元素累积和
以上方法都可传入axis参数,表示某个轴线方向操作:0轴表示行,1轴表示列
数组统计函数使用示例
import numpy as np
arr1d = np.random.randint(1,50,10)
arr2d = np.random.randint(1,50,(4,5))
print(arr1d.sum())
print(arr2d)
# 行的累积和
print(arr2d.sum(axis=1))
# 列的累积和
print(arr2d.sum(axis=0))
# 所有元素累积和
print(arr2d.sum())
# 行的平均值
print(arr2d.mean(axis=1))
# 列的平均值
print(arr2d.mean(axis=0))
# 所有元素平均值
print(arr2d.mean())
# 行的最大值
print(arr2d.max(axis=1))
# 列的最大值
print(arr2d.max(axis=0))
# 所有元素最大值
print(arr2d.max())
# 行的最大位置
print(arr2d.argmax(axis=1))
# 列的最大位置
print(arr2d.argmax(axis=0))
# 所有元素最大位置
print(arr2d.argmax())
排序
数组通过np.sort
实现对数组的排序
import numpy as np
a1 = np.floor(10*np.random.random((4,4)))
print a1
# 按照行维度排序
a1.sort(axis=1)
np.sort(a1, axis=1)
print a1
# 按照列维度排序
a1.sort(axis=0)
np.sort(a1, axis=0)
print a1
针对多维数组,可传入axis参数,按照某个轴线方向排序:0轴表示行,1轴表示列
布尔数组使用
布尔值会被强制转换为1(True)和0(False),因此sum可以统计布尔数组中True的个数
import numpy as np
arr = np.random.randn(100)
# 统计正数的个数
res = (arr>0).sum()
print(res)
np.any
检查数组至少有一个Truenp.all
检查数组每个元素都为True
import numpy as np
arr = np.random.randint(-50,50,10)
arr1 = arr>0
print(arr1)
print(arr1.any())
print(arr1.all())
数组唯一值
unique(x)
计算x中的唯一元素,并返回有序结果intersect1d(x, y)
计算x和y的公共元素,并返回有序结果union1d(x, y)
计算x和y的并集,并返回有序结果in1d(x, y)
得到一个表示x的元素是否包含于y的布尔数组setdiff1d(x, y)
集合的差,即元素在x中且不在setxor1d(x, y)
集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素
arr = np.array([3, 3, 2, 2, 1, 1, 4])
# 消重、排序输出
>>np.unique(arr)
array([1, 2, 3, 4])
# 等价于
>> sorted(set(arr))
array([1, 2, 3, 4])
# np.in1d 数组arr那些元素存在于第二个数组中,并返回布尔数组
>> np.in1d(arr, [2, 3, 6])
array([True, True, True, True, False, False, False])
常用数组函数
常用函数能对ndarray对象逐元素扫描操作
一元函数,接收一个参数,并返回一个数组结果。有:
abs
、fabs
计算数组元素绝对值sqrt
计算数组元素平方根square
计算数组元素平方exp
计算数组元素指数log
、log10
、log2
、log1p
分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x)sign
计算数组元素正负号ceil
计算数组元素ceiling值,即大于等于该值的最小整数floor
计算数组元素floor值,即小于等于该值的最大整数rint
计算数组元素值四舍五入到最接近的modf
将数组的小数和整数部分以两个独立的数组形式返回isnan
“哪些值是NaN” 返回布尔值isfinite
、isinf
“哪些元素是有穷的” “哪些元素是无穷的”cos
、cosh
、sin
、sinh
、tan
、tanh
普通型和双曲型三角函数arccos
、arccosh
、arcsin
、arcsinh
、arctan
、arctanh
反三角函数
二元函数,接收两个参数,并返回一个数组结果。有:
add
两个数组对应元素相加subtract
两个数组对应元素做减法multiply
数组元素相乘divide
、floor_divide
数组元素整除power
数组元素的n次方maximum
、fmax
获取数组元素最大值,fmax将忽略nanminimum
、fmin
获取数组元素最小值,fmin将忽略nanmod
元素级的求模计算copysign
将第一个数组的符号值改为第二个数组的符号值greater
、greater_equal
、less
、less_equal
、equal
、not_equal
数组元素比较运算,产生布尔型数组logical_and
、logical_or
、logical_xor
数组元素元素间与或运算
同时数组函数都可接受一个可选参数out,用于对数组进行按位操作
矩阵运算
首先说一下什么是矩阵,矩阵是数组的一个子集,数组可以有多维,一维、二维、三维、多维等,其中二维数组被称为矩阵
矩阵计算函数有:
- diag 将一个方阵的对角元素作为一维数组返回,或将一维数组转换成一个方阵,并且在非对角线为0点
- dot 矩阵点乘
- trace 计算对角线元素和
- det 计算矩阵行列式
- eig 计算方阵的特征值和特征向量
- inv 计算方阵的逆矩阵
- pinv 计算矩阵的Moore-Penrose伪逆
- qr 计算QR分解
- svd 计算奇异值分解(SVD)
- solve 解线性方程组Ax = b, 其中A为一个方阵
- lstsq 计算Ax = b的最小二乘解
额外说一下:矩阵点乘 使用np.dot
实现的,而运算符 *
是对数组逐元素乘积,千万不要跟矩阵点乘搞混!
总结
本节主要介绍NumPy 面向数组编程内容,涉及到NumPy大量函数,针对这些函数的使用额外补充一点:
除了可以这样arr.func
调用函数,也可以通过numpy.func
方式调用NumPy提供的函数!