Numpy 線性代數(shù)
在線性代數(shù)的范疇里,矩陣運算有很多不一樣的地方,例如內(nèi)積、行列式、逆運算等等。
Numpy 提供了一系列可以用于線性代數(shù)運算的函數(shù),具體如下:
函數(shù) | 描述 |
---|---|
dot | 兩個數(shù)組的點積,即元素對應相乘。 |
vdot | 兩個向量的點積 |
inner | 兩個數(shù)組的內(nèi)積 |
matmul | 兩個數(shù)組的矩陣積 |
determinant | 數(shù)組的行列式 |
solve | 求解線性矩陣方程 |
inv | 計算矩陣的乘法逆矩陣 |
1. 二元運算
1.1 numpy.dot 函數(shù)
對于兩個一維數(shù)組,dot() 函數(shù)計算的是這兩個數(shù)組對應下標元素的乘積和,也稱之為內(nèi)積。對于二維數(shù)組,計算的是兩個數(shù)組的矩陣乘積。
案例
創(chuàng)建兩個一維數(shù)組 a 和 b:
a = np.array([1, 2, 3, 4])
b = np.array([6, 7, 8, 9])
計算一維數(shù)組的內(nèi)積:
np.dot(a, b)
out:
80
創(chuàng)建兩個二維數(shù)組:
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[11, 22], [33, 44], [55, 66]])
計算二維數(shù)組的矩陣乘積:
np.dot(A, B)
out:
array([[242, 308],
[539, 704]])
可以發(fā)現(xiàn),對二維數(shù)組,矩陣的乘積滿足如下規(guī)律:m×p的矩陣A,p×n的矩陣B,其矩陣乘積結(jié)果為大小為m×n的矩陣。
1.2 numpy.vdot 函數(shù)
numpy.vdot() 函數(shù)是求兩個向量的點積,即對應位置的元素乘積求和。
案例
創(chuàng)建大小為 3×2 的矩陣 C:
C = np.array([[1, 2], [3, 4], [5, 6]])
求解點積:
np.vdot(B, C)
out:
1001
如果對于兩個維度不一致的矩陣進行點積運算:
np.vdot(A, B)
out:
1001
觀察發(fā)現(xiàn),對于維度不一致的矩陣,如果其元素個數(shù)相等,則可以進行 vdot 點積運算;因為在 vdot運算過程中,會首先將矩陣展開。
1.3 numpy.inner 函數(shù)
numpy.inner() 函數(shù)返回一維數(shù)組的向量內(nèi)積。對于更高的維度,它返回最后一個軸上的元素乘積之和。
案例
對大小為 3×2 的矩陣 B、C,求其內(nèi)積:
np.inner(B, C)
out:
array([[ 55, 121, 187],
[121, 275, 429],
[187, 429, 671]])
上述內(nèi)積的計算過程為:
[
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函數(shù)
numpy.matmul 函數(shù)返回兩個數(shù)組的矩陣乘積。對于二維數(shù)組,其計算結(jié)果與dot一致。
案例
np.matmul(A, B)
out:
array([[242, 308],
[539, 704]])
2. 線性代數(shù)求解
Numpy 提供了線性代數(shù)函數(shù)庫 linalg,該庫包含了求解線性代數(shù)問題所需的常用功能。
2.1 行列式
numpy.linalg.det() 函數(shù)計算輸入矩陣的行列式。
行列式在線性代數(shù)中是非常有用的值。 它從方陣的對角元素計算。 對于 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() 函數(shù)給出了矩陣形式的線性方程的解。
案例
對于如下方程組:
x + y + z =10
2x + y = 6
3y -2z = 2
將方程組轉(zhuǎn)化為矩陣形式: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() 函數(shù)計算矩陣的乘法逆矩陣。
逆矩陣的概念如下:設 A 是數(shù)域上的一個 n 階矩陣,若在相同數(shù)域上存在另一個 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. 小結(jié)
本節(jié)介紹了 Numpy 中與線性代數(shù)有關(guān)的常用函數(shù),其中重點介紹了內(nèi)積、點積、求行列式、求逆、求解方程等方法。