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
可以使用矩陣表示為:
如果矩陣成為A
、X
和B
,方程變為:
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)