使用numpy求矩阵的逆

85

我想使用numpy来计算逆矩阵,但是出现了一个错误:

'numpy.ndarry' object has no attribute I

要在numpy中计算矩阵的逆,假设矩阵为M,只需执行以下操作:

print M.I

这是代码:

x = numpy.empty((3,3), dtype=int)
for comb in combinations_with_replacement(range(10), 9):
   x.flat[:] = comb
   print x.I

我假设这个错误是因为x是扁平的,所以'I'命令不兼容。有没有解决方法?

我的目标是打印出所有可能的数值矩阵组合的逆矩阵。


1
我也在另一个答案中进行了评论,但你必须将x定义为矩阵np.matrix(x),以便.I方法可用。 - M4rtini
5个回答

111

I 属性仅存在于 matrix 对象上,而不是 ndarray 上。您可以使用 numpy.linalg.inv 来反转数组:

inverse = numpy.linalg.inv(x)

请注意,在您生成矩阵的方式中,并非所有矩阵都是可逆的。您需要更改矩阵生成方式,或跳过那些不可逆的矩阵。

try:
    inverse = numpy.linalg.inv(x)
except numpy.linalg.LinAlgError:
    # Not invertible. Skip this one.
    pass
else:
    # continue with what you were doing

另外,如果您想浏览所有元素从[0, 10)中抽取的3x3矩阵,则需要以下内容:

for comb in itertools.product(range(10), repeat=9):

使用product而不是combinations_with_replacement,否则您将会跳过类似于矩阵的内容。

numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])

“Module”对象没有属性inv… =/ - Jake Z
是的,我尝试过那个,但出现了“奇异矩阵”错误。O_O - Jake Z
3
这是因为你试图求逆不可逆的矩阵。例如,你生成的矩阵之一是零矩阵。 - user2357112
太棒了!我完全忘记检查奇异矩阵了-_-哈哈,谢谢。运行得很好。 - Jake Z
1
@anu:这是一个线性代数问题,而不是编程问题。根据线性代数的原理,你的第一个矩阵是可逆的,而其他两个则不是。并不是所有的方阵都有逆矩阵,这是可以预料的。 - user2357112
显示剩余6条评论

26

另一种方法是使用 numpy 的 matrix (而不是 numpy 数组)和 I 属性。例如:

>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5,  1.5],
       [ 2. , -1. ]])

我更喜欢这种方法,因为它更直接。但是它们两个的效果完全相同。 - Parsa
1
虽然 np.matrix 的使用很方便,但官方不鼓励使用它,因为它会给 np.array 用户带来歧义:scipy.linalg - Shahrokh Bah
1
它也被弃用了:https://numpy.org/devdocs/reference/generated/numpy.matrix.html#numpy.matrix - cuppajoeman

14

使用Python和NumPy计算矩阵的逆:

>>> import numpy as np
>>> b = np.array([[2,3],[4,5]])
>>> np.linalg.inv(b)
array([[-2.5,  1.5],
       [ 2. , -1. ]])

并非所有的矩阵都可以被求逆,例如奇异矩阵不可逆

>>> import numpy as np
>>> b = np.array([[2,3],[4,6]])
>>> np.linalg.inv(b)

LinAlgError: Singular matrix

奇异矩阵问题的解决方案:

尝试使用try-catch捕获奇异矩阵异常,并继续执行,直到找到一个满足您先前标准且可逆的变换。


3

我尝试了,但是出现了“奇异矩阵”错误...很可能是因为它被压平了....我想知道是否有一种方法可以将其重新塑形回原始状态,然后再求逆? - Jake Z
将其原始状态存储起来,然后通过包含当前状态和指示其原始状态的属性的对象进行引用可能更容易。numpy.linalg.lstsq 将尝试为您提供最小二乘解,但我不知道是否有任何特别简洁的方法。 - user1330052

2

不知道是否有人已经提到过这一点,但我想指出matrix_object。Inp.linalg.inv(matrix_object)不会给出真正的逆矩阵。这让我很苦恼。对于矩阵对象mnp.dot(m,m.I)=一个单位矩阵是正确的,但是np.dot(m.I,m)=/ = I 。对于np.linalg.inv(I)也是一样。

要小心使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接