Numpy 線性代數
在線性代數的范疇里,矩陣運算有很多不一樣的地方,例如內積、行列式、逆運算等等。
Numpy 提供了一系列可以用于線性代數運算的函數,具體如下:
函數 | 描述 |
---|---|
dot | 兩個數組的點積,即元素對應相乘。 |
vdot | 兩個向量的點積 |
inner | 兩個數組的內積 |
matmul | 兩個數組的矩陣積 |
determinant | 數組的行列式 |
solve | 求解線性矩陣方程 |
inv | 計算矩陣的乘法逆矩陣 |
1. 二元運算
1.1 numpy.dot 函數
對于兩個一維數組,dot() 函數計算的是這兩個數組對應下標元素的乘積和,也稱之為內積。對于二維數組,計算的是兩個數組的矩陣乘積。
案例
創建兩個一維數組 a 和 b:
a = np.array([1, 2, 3, 4])
b = np.array([6, 7, 8, 9])
計算一維數組的內積:
np.dot(a, b)
out:
80
創建兩個二維數組:
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[11, 22], [33, 44], [55, 66]])
計算二維數組的矩陣乘積:
np.dot(A, B)
out:
array([[242, 308],
[539, 704]])
可以發現,對二維數組,矩陣的乘積滿足如下規律:m×p的矩陣A,p×n的矩陣B,其矩陣乘積結果為大小為m×n的矩陣。
1.2 numpy.vdot 函數
numpy.vdot() 函數是求兩個向量的點積,即對應位置的元素乘積求和。
案例
創建大小為 3×2 的矩陣 C:
C = np.array([[1, 2], [3, 4], [5, 6]])
求解點積:
np.vdot(B, C)
out:
1001
如果對于兩個維度不一致的矩陣進行點積運算:
np.vdot(A, B)
out:
1001
觀察發現,對于維度不一致的矩陣,如果其元素個數相等,則可以進行 vdot 點積運算;因為在 vdot運算過程中,會首先將矩陣展開。
1.3 numpy.inner 函數
numpy.inner() 函數返回一維數組的向量內積。對于更高的維度,它返回最后一個軸上的元素乘積之和。
案例
對大小為 3×2 的矩陣 B、C,求其內積:
np.inner(B, C)
out:
array([[ 55, 121, 187],
[121, 275, 429],
[187, 429, 671]])
上述內積的計算過程為:
[
11*1+22*2=55, 11*3+22*4=121, 11*5+22*6=187
33*1+44*2=121, 33*3+44*4=275, 33*5+44*6=429
55*1+66*2=187, 55*3+66*4=429, 55*5+66*6=671
]
1.4 numpy.matmul函數
numpy.matmul 函數返回兩個數組的矩陣乘積。對于二維數組,其計算結果與dot一致。
案例
np.matmul(A, B)
out:
array([[242, 308],
[539, 704]])
2. 線性代數求解
Numpy 提供了線性代數函數庫 linalg,該庫包含了求解線性代數問題所需的常用功能。
2.1 行列式
numpy.linalg.det() 函數計算輸入矩陣的行列式。
行列式在線性代數中是非常有用的值。 它從方陣的對角元素計算。 對于 2×2 矩陣,它是左上和右下元素的乘積與其他兩個的乘積的差。換句話說,對于矩陣 [[a,b],[c,d]],行列式計算為 ad-bc。 較大的方陣被認為是 2×2 矩陣的組合。
案例
M = np.array([[6, 2, 1], [4, -2, 15], [12, 8, 7]])
M
out:
array([[ 6, 2, 1],
[ 4, -2, 15],
[12, 8, 7]])
求解矩陣 M 的行列式:
np.linalg.det(M)
out:
-444
2.2 方程組的解
numpy.linalg.solve() 函數給出了矩陣形式的線性方程的解。
案例
對于如下方程組:
x + y + z =10
2x + y = 6
3y -2z = 2
將方程組轉化為矩陣形式:Ax=b,則有:
A = np.array([[1, 1, 1], [2, 1, 0], [0, 3, -2]])
b = np.array([[10], [6], [2]])
求解方程組:
np.linalg.solve(A, b)
out:
array([[1.],
[4.],
[5.]])
即上述方程組的解為:x=1,y=4,z=5。
2.3 逆矩陣
numpy.linalg.inv() 函數計算矩陣的乘法逆矩陣。
逆矩陣的概念如下:設 A 是數域上的一個 n 階矩陣,若在相同數域上存在另一個 n 階矩陣 B,使得: AB=BA=E ,則我們稱 B 是 A 的逆矩陣,而A則被稱為可逆矩陣。
注意:E 為單位矩陣。
案例
利用逆矩陣,可以換一種思路求解 2.2 中的方程組的解:
對于矩陣 A,假設逆矩陣為 F,則有:x=Fb。因此方程組的解為:
print("計算A的逆矩陣:")
F = np.linalg.inv(A)
print("A的逆矩陣F:", F)
print("方程組的解為:", np.matmul(F, b))
計算過程如下:
計算A的逆矩陣:
A的逆矩陣F: [[-0.25 0.625 -0.125]
[ 0.5 -0.25 0.25 ]
[ 0.75 -0.375 -0.125]]
方程組的解為: [[1.]
[4.]
[5.]]
3. 小結
本節介紹了 Numpy 中與線性代數有關的常用函數,其中重點介紹了內積、點積、求行列式、求逆、求解方程等方法。