NumPy線性代數


NumPy - 線性代數

NumPy 包包含numpy.linalg模組,提供線性代數所需的所有功能。 此模組中的一些重要功能如下表所述。

序號 函式及描述
1. dot 兩個陣列的點積
2. vdot 兩個向量的點積
3. inner 兩個陣列的內積
4. matmul 兩個陣列的矩陣積
5. determinant 陣列的行列式
6. solve 求解線性矩陣方程
7. inv 尋找矩陣的乘法逆矩陣

numpy.dot()

此函式返回兩個陣列的點積。 對於二維向量,其等效於矩陣乘法。 對於一維陣列,它是向量的內積。 對於 N 維陣列,它是a的最後一個軸上的和與b的倒數第二個軸的乘積。

import numpy.matlib 
import numpy as np 

a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
np.dot(a,b)

輸出如下:

[[37  40] 
 [85  92]]

要注意點積計算為:

[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]

numpy.vdot()

此函式返回兩個向量的點積。 如果第一個引數是複數,那麼它的共軛複數會用於計算。 如果引數id是多維陣列,它會被展開。

例子

import numpy as np 
a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
print np.vdot(a,b)

輸出如下:

130

注意:1*11 + 2*12 + 3*13 + 4*14 = 130

numpy.inner()

此函式返回一維陣列的向量內積。 對於更高的維度,它返回最後一個軸上的和的乘積。

例子

import numpy as np 
print np.inner(np.array([1,2,3]),np.array([0,1,0])) 
# 等價於 1*0+2*1+3*0

輸出如下:

2

例子

# 多維陣列範例 
import numpy as np 
a = np.array([[1,2], [3,4]]) 

print '陣列 a:' 
print a 
b = np.array([[11, 12], [13, 14]]) 

print '陣列 b:' 
print b 

print '內積:' 
print np.inner(a,b)

輸出如下:

陣列 a:
[[1 2]
[3 4]]

陣列 b:
[[11 12]
[13 14]]

內積:
[[35 41]
[81 95]]

上面的例子中,內積計算如下:

1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14

numpy.matmul

numpy.matmul()函式返回兩個陣列的矩陣乘積。 雖然它返回二維陣列的正常乘積,但如果任一引數的維數大於2,則將其視為存在於最後兩個索引的矩陣的棧,並進行相應廣播。

另一方面,如果任一引數是一維陣列,則通過在其維度上附加 1 來將其提升為矩陣,並在乘法之後被去除。

例子

# 對於二維陣列,它就是矩陣乘法
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [[4,1],[2,2]] 
print np.matmul(a,b)

輸出如下:

[[4  1] 
 [2  2]]

例子

# 二維和一維運算
import numpy.matlib 
import numpy as np 

a = [[1,0],[0,1]] 
b = [1,2] 
print np.matmul(a,b) 
print np.matmul(b,a)

輸出如下:

[1  2] 
[1  2]

例子

# 維度大於二的陣列 
import numpy.matlib 
import numpy as np 

a = np.arange(8).reshape(2,2,2) 
b = np.arange(4).reshape(2,2) 
print np.matmul(a,b)

輸出如下:

[[[2   3] 
   [6   11]] 
  [[10  19] 
   [14  27]]]

numpy.linalg.det()

行列式線上性代數中是非常有用的值。 它從方陣的對角元素計算。 對於 2×2 矩陣,它是左上和右下元素的乘積與其他兩個的乘積的差。

換句話說,對於矩陣[[a,b],[c,d]],行列式計算為ad-bc。 較大的方陣被認為是 2×2 矩陣的組合。

numpy.linalg.det()函式計算輸入矩陣的行列式。

例子

import numpy as np
a = np.array([[1,2], [3,4]]) 
print np.linalg.det(a)

輸出如下:

-2.0

例子

b = np.array([[6,1,1], [4, -2, 5], [2,8,7]]) 
print b 
print np.linalg.det(b) 
print 6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2)

輸出如下:

[[ 6 1 1]
 [ 4 -2 5]
 [ 2 8 7]]

-306.0

-306

numpy.linalg.solve()

numpy.linalg.solve()函式給出了矩陣形式的線性方程的解。

考慮以下線性方程:

x + y + z = 6

2y + 5z = -4

2x + 5y - z = 27

可以使用矩陣表示為:

如果矩陣成為AXB,方程變為:

AX = B

X = A^(-1)B

numpy.linalg.inv()

我們使用numpy.linalg.inv()函式來計算矩陣的逆。 矩陣的逆是這樣的,如果它乘以原始矩陣,則得到單位矩陣。

例子

import numpy as np 

x = np.array([[1,2],[3,4]]) 
y = np.linalg.inv(x) 
print x 
print y 
print np.dot(x,y)

輸出如下:

[[1 2]                                                                        
 [3 4]]                                                                       
[[-2.   1. ]                                                                  
 [ 1.5 -0.5]]                                                                 
[[  1.00000000e+00   1.11022302e-16]                                          
 [  0.00000000e+00   1.00000000e+00]]

例子

現在讓我們在範例中建立一個矩陣A的逆。

import numpy as np 
a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) 

print '陣列 a:'
print a 
ainv = np.linalg.inv(a) 

print 'a 的逆:' 
print ainv  

print '矩陣 b:' 
b = np.array([[6],[-4],[27]]) 
print b 

print '計算:A^(-1)B:' 
x = np.linalg.solve(a,b) 
print x  
# 這就是線性方向 x = 5, y = 3, z = -2 的解

輸出如下:

陣列 a:
[[ 1 1 1]
 [ 0 2 5]
 [ 2 5 -1]]

a 的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
 [-0.47619048 0.14285714 0.23809524]
 [ 0.19047619 0.14285714 -0.0952381 ]]

矩陣 b:
[[ 6]
 [-4]
 [27]]

計算:A^(-1)B:
[[ 5.]
 [ 3.]
 [-2.]]

結果也可以使用下列函式獲取

x = np.dot(ainv,b)