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