NumPy基础:线性代数

线性代数,比如矩阵乘法、分解、行列式等方阵数学,是所有数组类库的重要组成部分。和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的最小二乘解

猜你喜欢

转载自blog.csdn.net/weixin_43303087/article/details/84318436