线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。和Matlab等其他语言相比,NumPy的线性代数中所不同的是*是矩阵的逐元素乘积,而不是矩阵的点乘积。因此NumPy的数组方法和numpy命名空间中都有一个函数dot,用于矩阵的操作:
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
y = np.array([[6,23],[-1,7],[8,9]])
print(x)
-----------------------------------
[[1 2 3]
[4 5 6]]
print(y)
-----------------------------------
[[ 6 23]
[-1 7]
[ 8 9]]
print(x.dot(y))
-----------------------------------
[[ 28 64]
[ 67 181]]
print(np.dot(x,y))
-----------------------------------
[[ 28 64]
[ 67 181]]
二维数组和一个长度合适的一维数组之间的矩阵乘积,其结果是一个一维数组:
x = np.array([[1,2,3],[4,5,6]])
print(np.dot(x,np.ones(3))) #[ 6. 15.]
特殊符号@也作为中缀操作符,用于点乘矩阵操作:
x = np.array([[1,2,3],[4,5,6]])
print(x @ np.ones(3)) #[ 6. 15.]
numpy.linalg拥有一个矩阵分解的标准函数库,以及其他常用函数,例如求逆矩阵和行列式求解。这些函数都是通过在MATLAB和R等其他语言使用的相同的行业标准线性代数库来实现的:
from numpy.linalg import inv,qr
X = np.random.randn(5,5)
mat = X.T.dot(X)
print(inv(mat))
--------------------------------------------------------------
[[ 0.99280802 -1.66497271 1.08709676 -1.20419207 -0.58009393]
[-1.66497271 4.78539379 -1.21698048 2.36701733 0.70531335]
[ 1.08709676 -1.21698048 2.14800734 -1.45941075 -0.7995963 ]
[-1.20419207 2.36701733 -1.45941075 2.18687936 0.50661344]
[-0.58009393 0.70531335 -0.7995963 0.50661344 0.69783058]]
print(mat.dot(inv(mat)))
--------------------------------------------------------------
[[ 1.00000000e+00 -8.88178420e-16 -1.33226763e-15 -4.44089210e-16
-8.88178420e-16]
[ 4.99600361e-16 1.00000000e+00 -5.55111512e-17 -1.31838984e-16
-2.84494650e-16]
[-6.66133815e-16 -4.44089210e-16 1.00000000e+00 5.55111512e-16
1.11022302e-16]
[-1.11022302e-16 -1.11022302e-16 0.00000000e+00 1.00000000e+00
-2.22044605e-16]
[ 0.00000000e+00 0.00000000e+00 -8.88178420e-16 -2.22044605e-16
1.00000000e+00]]
q,r = qr(mat)
print(r)
--------------------------------------------------------------
[[-9.07819827 -1.35065084 1.06323035 -1.98403118 -3.98283901]
[ 0. -1.00460996 1.77481117 2.10840989 2.02836511]
[ 0. 0. -1.19898847 -0.31205201 -1.73252293]
[ 0. 0. 0. -0.58111008 1.3096621 ]
[ 0. 0. 0. 0. 0.67161684]]
常用numpy.linalg函数图表:
函数 | 描述 |
---|---|
diag | 将一个方阵的对角(或非对角)元素作为一维数组返回,或者将一维数组转换成一个方阵,并且在非对角线上有零点 |
dot | 矩阵点乘 |
trace | 计算对角元素和 |
det | 计算矩阵的行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
qr | 计算QR分解 |
solve | 求解x的线性系统Ax=b,其中A为方阵 |
lstsq | 计算Ax = b的最小二乘解 |