NumPy 系列(六):numpy 数组函数
6.1 矩阵乘积
- 第五章中的乘法都是“逐元素相乘”,这里介绍线性代数中的矩阵乘 积,
本节只需要使用 np.dot( ) 函数。 - 当矩阵乘积中混有向量时,根据需求,其可充当行矩阵,也可充当列矩阵,
但混有向量时输出结果必为向量。
(1)向量与向量的乘积
设两个向量的形状按前后顺序分别是 5 以及 5 。从矩阵乘法的角度,有
(1,5) * ( 5,1) = (1,1) ,因此输出的应该是形状为 1 的向量。
import numpy as np
arr1 = np.arange(5)
arr2 = np.arange(5)
print(arr1)
print(arr2)
print(np.dot(arr1,arr2))
[0 1 2 3 4]
[0 1 2 3 4]
30
(2)向量与矩阵的乘积
设 向 量 的 形 状 是 5 , 矩 阵 的 形 状 是 (5,3) 。 从 矩 阵 乘 法 的 角 度 , 有
(1,5) * ( 5,3) = (1,3) ,因此输出的应该是形状为 3 的向量。
import numpy as np
arr1 = np.arange(5)
arr2 = np.arange(15).reshape(5,3)
print(arr1)
print(arr2)
print(np.dot(arr1,arr2))
[0 1 2 3 4]
[[ 0 1 2][ 3 4 5][ 6 7 8][ 9 10 11][12 13 14]]
[ 90 100 110]
(3)矩阵与向量的乘积
设 矩 阵 的 形 状 是 (3,5) , 向 量 的 形 状 是 5 。 从 矩 阵 乘 法 的 角 度 , 有
( 3,5) * ( 5,1) = ( 3,1) ,因此输出的应该是形状为 3 的向量。
import numpy as np
arr1 = np.arange(15).reshape(3,5)
arr2 = np.arange(5)
print(arr1)
print(arr2)
print(np.dot(arr1,arr2))
[[ 0 1 2 3 4][ 5 6 7 8 9][10 11 12 13 14]]
[0 1 2 3 4]
[ 30 80 130]
(4)矩阵与矩阵的乘积
设两个矩阵的形状按前后顺序分别是 (3,4) 以及 (4,2) 。从矩阵乘法的角度,
有 ( 3, 4 ) * ( 4,2 ) = ( 3,2 ) ,因此输出的应该是形状为 (3,2) 的矩阵。
import numpy as np
arr1=np.arange(1,13).reshape(3,4)
arr2=np.random.random([4,2])
arr3=np.dot(arr1,arr2)
print(arr1,'\n\n',arr2,'\n\n')
print(arr3)
[[ 1 2 3 4][ 5 6 7 8][ 9 10 11 12]] [[0.88254898 0.56348161][0.96504666 0.1235308 ][0.55066902 0.16574346][0.46506491 0.24950043]] [[ 6.324909 2.30577533][17.77822726 6.71480055][29.23154552 11.12382578]]
6.2 数学函数
NumPy 设计了很多数学函数,这里列举其中最重要、最常见的几个。
import numpy as numpy
# 绝对值
print(np.abs(np.array([-1,2,-4,0])))
# 三角函数
print(np.sin(np.array([0,np.pi/4,np.pi/2,np.pi])))
print(np.cos(np.array([0,np.pi/4,np.pi/2,np.pi])))
print(np.tan(np.array([0,np.pi/4,np.pi/2,np.pi]))) # 注:理论上没有tan(pi/2)
# 指数
x=np.arange(1,4)
print('e^x:',np.exp(x))
print('2^x:',2**x)
print('10^x:',10**x)
# 对数
x=np.array([1,10,100,1000])
print('lnx:',np.log(x))
print('logx:',np.log(x)/np.log(10))
print('log2x:',np.log(x)/np.log(2))
[1 2 4 0]
[0.00000000e+00 7.07106781e-01 1.00000000e+00 1.22464680e-16]
[ 1.00000000e+00 7.07106781e-01 6.12323400e-17 -1.00000000e+00]
[ 0.00000000e+00 1.00000000e+00 1.63312394e+16 -1.22464680e-16]
e^x: [ 2.71828183 7.3890561 20.08553692]
2^x: [2 4 8]
10^x: [ 10 100 1000]
lnx: [0. 2.30258509 4.60517019 6.90775528]
logx: [0. 1. 2. 3.]
log2x: [0. 3.32192809 6.64385619 9.96578428]
6.3 聚合函数
聚合很有用,这里用矩阵演示。向量与之一致,但没有 axis 参数。以下在注
释中介绍了 6 个最重要的聚合函数,其用法完全一致,仅演示其中 3 个。
import numpy as np
# 最大最小值函数 np.max()和np.min()
arr=np.random.random((2,3))
print(arr)
print(np.max(arr,axis=0)) # 按照第0维度比较取最大值,输出的是 !向量!
print(np.max(arr,axis=1)) # 按照第1维度比较取最大值,输出的是 !向量!
print(np.max(arr)) # 整体求最值,输出的是数值
[[0.44539283 0.49987913 0.83105926][0.5879637 0.21155906 0.62317448]]
[0.5879637 0.49987913 0.83105926]
[0.83105926 0.62317448]
0.8310592624903511
# 求和函数 np.sum() 与 求积函数 np.prod()
print(np.sum(arr,axis=0)) # 输出的是向量print(np.prod(arr,axis=1)) # 输出的是向量print(np.sum(arr)) # 输出的是数值
print(np.prod(arr)) # 输出的是数值
[1.03335654 0.71143819 1.45423374]
[0.18502918 0.07751608]
3.1990284639749205
0.014342736526674758
# 求均值 np.mean() 和 标准差(即方差开根号)np.std()
arr=np.arange(10).reshape(2,5)
print(arr)
print(np.mean(arr,axis=0)) # 输出的是向量
print(np.mean(arr,axis=1))
print(np.mean(arr)) # 输出的是数值
print(np.std(arr,axis=0)) # 输出的是向量
print(np.std(arr,axis=1))
print(np.std(arr)) # 输出的是数值
[[0 1 2 3 4][5 6 7 8 9]]
[2.5 3.5 4.5 5.5 6.5]
[2. 7.]
4.5
[2.5 2.5 2.5 2.5 2.5]
[1.41421356 1.41421356]
2.8722813232690143
- 当 axis=0 时,最终结果与每一行的元素个数一致;
当 axis=1 时,最终结果与每一列的元素个数一致。 - 考虑到大型数组难免有缺失值,以上聚合函数碰到缺失值时会报错,因此
出现了聚合函数的安全版本 ,即计算 时忽 略缺失 值:np.nansum( )、
np.nanprod( ) 、np.nanmean( )、np.nanstd( )、np.nanmax( )、np.nanmin( )。