使用numpy反转矩阵

时间:2014-02-07 22:24:39

标签: python numpy matrix

我想使用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'命令不兼容。有解决方法吗?

我的目标是打印每个可能的数值矩阵组合的INVERSE MATRIX。

4 个答案:

答案 0 :(得分:51)

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):

而不是combinations_with_replacement,或者你会跳过像

这样的矩阵
numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])

答案 1 :(得分:10)

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

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

答案 2 :(得分:7)

使用python和numpy反转矩阵:

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

并非所有矩阵都可以反转。例如singular matrices are not Invertable

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

LinAlgError: Singular matrix

解决奇异矩阵问题:

尝试捕捉奇异矩阵异常并继续前进,直到找到符合先前标准的变换并且也是可逆的。

直觉为什么矩阵反演不能总是这样做;像在奇异矩阵中一样:

想象一下一部老式的高架电影放映机,它通过电影将明亮的光线照射到白墙上。胶片中的像素投影到墙上的像素。

如果我在一个画面上停止胶片投影,你会在墙上看到胶片的像素,我会要求你根据你看到的内容重新制作胶片。你说,这很简单,只需要执行投影的矩阵的反转即可。矩阵的逆是投影的逆转。

现在想象一下,如果投影机损坏了,我在电影前面放了一个扭曲的镜头。现在,多个像素投射到墙上的同一点。我再次问你要用矩阵反转"撤消这个操作。你说:"我不能因为你用镜头失真破坏了信息,我无法回到原来的位置,因为矩阵是奇异的或退化的。"

只有在不丢失信息的情况下才能反转过程,才能将可用于将某些数据转换为其他数据的矩阵进行反转。如果您的矩阵无法反转,也许您使用猜测和检查方法定义您的投影,而不是使用保证无损变换的过程。

如果您正在使用启发式或任何不完美的数学精度,那么您必须定义另一个过程来管理和隔离失真,以便布朗运动的编程可以恢复。

来源:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv

答案 3 :(得分:2)

inv怎么办?

例如为:     my_inverse_array = inv(my_array)