1. 程式人生 > >NumPy基礎:線性代數

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的最小二乘解