Python 中的矩阵逆运算

Manav Narula 2023年10月10日
  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 类来查找矩阵的逆矩阵。最后,我们讨论了一系列用户定义的函数,它们通过实现算术逻辑来计算逆。

作者: 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