如何修复:numpy.linalg.LinAlgError奇异矩阵的错误

1,339 阅读2分钟

你在Python中可能遇到的一个错误是。

numpy.linalg.LinAlgError: Singular matrix

当你试图反转一个奇异矩阵时就会发生这个错误,根据定义,奇异矩阵是一个行列式为零的矩阵,不能被反转。

本教程分享如何在实践中解决这个错误。

如何重现该错误

假设我们用NumPy创建了下面这个矩阵:

import numpy as np

#create 2x2 matrix
my_matrix = np.array([[1., 1.], [1., 1.]])

#display matrix
print(my_matrix)

[[1. 1.]
 [1. 1.]]

现在假设我们试图使用NumPy的inv()函数来计算该矩阵的逆值:

from numpy import inv

#attempt to invert matrix
inv(my_matrix)

numpy.linalg.LinAlgError: Singular matrix

我们会收到一个错误,因为我们创建的矩阵没有一个逆矩阵。

注意:看看Wolfram MathWorld的这个页面,它显示了10个没有逆矩阵的矩阵的不同例子。

根据定义,如果一个矩阵的行列式为零,它就是奇异的,不能被反转。

你可以使用NumPy的det()函数来计算一个给定矩阵的行列式,然后再尝试反转它:

from numpy import det

#calculate determinant of matrix
det(my_matrix)

0.0

我们的矩阵的行列式是零,这就解释了为什么我们会遇到一个错误。

如何修复这个错误

绕过这个错误的唯一方法是简单地创建一个非奇异的矩阵。

例如,假设我们使用inv()函数来反转下面的矩阵:

import numpy as np
from numpy.linalg import inv, det

#create 2x2 matrix that is not singular
my_matrix = np.array([[1., 7.], [4., 2.]])

#display matrix
print(my_matrix)

[[1. 7.]
 [4. 2.]]

#calculate determinant of matrix
print(det(my_matrix))

-25.9999999993

#calculate inverse of matrix
print(inv(my_matrix))

[[-0.07692308  0.26923077]
 [ 0.15384615 -0.03846154]]

我们在反转矩阵时不会收到任何错误,因为该矩阵不是奇异的。

其他资源

下面的教程解释了如何修复Python中的其他常见错误:

如何修复:'numpy.float64'对象不可调用
如何修复:'numpy.ndarray'对象不可调用
如何修复:'numpy.float64'对象不能被解释成整数