Python 中的矩陣逆運算

Manav Narula 2023年1月30日 2022年5月17日
  1. 在 Python 中使用 numpy.linalg.inv() 函式求矩陣的逆
  2. 在 Python 中使用 numpy.matrix 類求矩陣的逆
  3. 在 Python 中使用 scipy.linalg.inv() 函式求逆矩陣
  4. 在 Python 中建立使用者定義的函式以求矩陣的逆矩陣
Python 中的矩陣逆運算

矩陣是具有相同大小的每個元素的二維陣列。我們可以使用 numpy 陣列或巢狀列表來表示矩陣。

對於行列式不為零的非奇異矩陣,存在一個唯一矩陣,當與原始矩陣相乘時,該矩陣會產生一個單位矩陣。這個唯一的矩陣稱為原始矩陣的逆矩陣。

本教程將演示如何使用多種方法在 Python 中對矩陣求逆。

在 Python 中使用 numpy.linalg.inv() 函式求矩陣的逆

numpy 模組具有在 Python 中建立和運算元組的不同功能。numpy.linalg 子模組實現了不同的線性代數演算法和函式。

我們可以使用該模組中的 numpy.linalg.inv() 函式來計算給定矩陣的逆矩陣。如果矩陣的逆是不可能的,則此函式會引發錯誤,這可能是因為矩陣是奇異的。

因此,建議在 tryexcept 塊中使用此功能。如果矩陣是奇異的,則會引發錯誤,並執行 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 中求逆矩陣的方法。numpyscipy 模組具有計算矩陣逆的 linalg.inv() 函式。

我們還可以使用 numpy.matrix 類來查詢矩陣的逆矩陣。最後,我們討論了一系列使用者定義的函式,它們通過實現算術邏輯來計算逆。

Author: Manav Narula
Manav Narula avatar Manav Narula avatar

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