Python 中的矩陣逆運算
-
在 Python 中使用
numpy.linalg.inv()
函式求矩陣的逆 -
在 Python 中使用
numpy.matrix
類求矩陣的逆 -
在 Python 中使用
scipy.linalg.inv()
函式求逆矩陣 - 在 Python 中建立使用者定義的函式以求矩陣的逆矩陣
矩陣是具有相同大小的每個元素的二維陣列。我們可以使用 numpy
陣列或巢狀列表來表示矩陣。
對於行列式不為零的非奇異矩陣,存在一個唯一矩陣,當與原始矩陣相乘時,該矩陣會產生一個單位矩陣。這個唯一的矩陣稱為原始矩陣的逆矩陣。
本教程將演示如何使用多種方法在 Python 中對矩陣求逆。
在 Python 中使用 numpy.linalg.inv()
函式求矩陣的逆
numpy
模組具有在 Python 中建立和運算元組的不同功能。numpy.linalg
子模組實現了不同的線性代數演算法和函式。
我們可以使用該模組中的 numpy.linalg.inv()
函式來計算給定矩陣的逆矩陣。如果矩陣的逆是不可能的,則此函式會引發錯誤,這可能是因為矩陣是奇異的。
因此,建議在 try
和 except
塊中使用此功能。如果矩陣是奇異的,則會引發錯誤,並執行 except
塊中的程式碼。
程式碼片段:
import numpy as np
try:
m = np.array([[4,3],[8,5]])
print(np.linalg.inv(m))
except:
print("Singular Matrix, Inverse not possible.")
輸出:
[[-1.25 0.75]
[ 2. -1. ]]
在 Python 中使用 numpy.matrix
類求矩陣的逆
很長一段時間以來,numpy.matrix
類被用來表示 Python 中的矩陣。這與使用普通二維陣列進行矩陣表示相同。
numpy.matrix
物件具有屬性 numpy.matrix.I
計算給定矩陣的逆矩陣。如果使用奇異矩陣,也會引發錯誤。
程式碼片段:
import numpy as np
try:
m = np.matrix([[4,3],[8,5]])
print(m.I)
except:
print("Singular Matrix, Inverse not possible.")
輸出:
[[-1.25 0.75]
[ 2. -1. ]]
雖然這兩種方法在內部工作相同,但不鼓勵使用 numpy.matrix
類。這是因為它在使用 numpy
陣列時已被棄用且模稜兩可。
在 Python 中使用 scipy.linalg.inv()
函式求逆矩陣
我們可以使用 scipy
模組使用其功能執行不同的科學計算。它也適用於 numpy
陣列。
scipy.linalg.inv()
還可以返回 Python 中給定方陣的逆。它的工作方式與 numpy.linalg.inv()
函式相同。
程式碼片段:
import numpy as np
from scipy import linalg
try:
m = np.matrix([[4,3],[8,5]])
print(linalg.inv(m))
except:
print("Singular Matrix, Inverse not possible.")
輸出:
[[-1.25 0.75]
[ 2. -1. ]]
在 Python 中建立使用者定義的函式以求矩陣的逆矩陣
我們可以在 Python 中實現計算逆矩陣的數學邏輯。為此,我們將使用一系列使用者定義的函式。
我們將建立不同的函式來返回行列式、轉置和矩陣行列式。這些函式將用於返回最終逆的函式中。
當我們在 Python 中將矩陣表示為列表列表時,此方法有效。
程式碼片段:
def return_transpose(mat):
return map(list,zip(*mat))
def return_matrix_minor(mat,i,j):
return [row[:j] + row[j+1:] for row in (mat[:i]+mat[i+1:])]
def return_determinant(mat):
if len(mat) == 2:
return mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0]
determinant = 0
for c in range(len(m)):
determinant += ((-1)**c)*m[0][c]*return_determinant(return_matrix_minor(m,0,c))
return determinant
def inverse_matrix(m):
determinant = return_determinant(m)
if len(m) == 2:
return [[m[1][1]/determinant, -1*m[0][1]/determinant],
[-1*m[1][0]/determinant, m[0][0]/determinant]]
cfs = []
for r in range(len(m)):
cfRow = []
for c in range(len(m)):
minor = return_matrix_minor(m,r,c)
cfRow.append(((-1)**(r+c)) * return_determinant(minor))
cfs.append(cfRow)
cfs = return_transpose(cfs)
for r in range(len(cfs)):
for c in range(len(cfs)):
cfs[r][c] = cfs[r][c]/determinant
return cfs
m = [[4,3],[8,5]]
print(inverse_matrix(m))
輸出:
[[-1.25, 0.75], [2.0, -1.0]]
上面的示例返回一個巢狀列表,表示給定矩陣的逆矩陣。
最後,我們討論了幾種在 Python 中求逆矩陣的方法。numpy
和 scipy
模組具有計算矩陣逆的 linalg.inv()
函式。
我們還可以使用 numpy.matrix
類來查詢矩陣的逆矩陣。最後,我們討論了一系列使用者定義的函式,它們通過實現算術邏輯來計算逆。
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn