使用numpy反转矩阵

Jak*_*e Z 51 python numpy matrix

我想使用numpy来计算逆.但我收到一个错误:

'numpy.ndarry' object has no attribute I
Run Code Online (Sandbox Code Playgroud)

要计算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
Run Code Online (Sandbox Code Playgroud)

我假设发生此错误是因为x现在是平的,因此' I'命令不兼容.有没有解决这个问题?

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

use*_*ica 63

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

inverse = numpy.linalg.inv(x)
Run Code Online (Sandbox Code Playgroud)

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

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

此外,如果要浏览所有使用[0,10]绘制的元素的3x3矩阵,您需要以下内容:

for comb in itertools.product(range(10), repeat=9):
Run Code Online (Sandbox Code Playgroud)

而不是combinations_with_replacement,或者你会跳过像这样的矩阵

numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

  • @JakeZ:那是因为你试图反转不可逆转的矩阵.例如,您生成的矩阵之一是0矩阵. (2认同)

dag*_*rha 11

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

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


Eri*_*ski 9

使用python和numpy反转矩阵:

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

并非所有矩阵都可以反转.例如,奇异矩阵不是可逆的:

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

LinAlgError: Singular matrix
Run Code Online (Sandbox Code Playgroud)

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

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

矩阵反演的直觉和ELI5以及为什么有时无法完成:

想象一下,一部电影电影放映机将电影上的明亮光线照射到白墙上,浓缩电影中的像素被"投射"到墙上的像素上.

我在一个画面上停止了电影投影,你看到白墙上的像素,我要求你重新投影它的电影.这很简单,只需采用执行投影的矩阵的逆.投影的矩阵反转.

现在想象一下,如果投影机损坏,胶片上的多个像素投射到墙上的同一位置.然后我请你"用矩阵逆撤消这个操作".你说:"我不能,信息在投影中被破坏,我无法回到原来的位置,因为矩阵是奇异的还是退化的."

只有在不丢失信息的情况下才能反转过程,用于将数据转换为其他数据的矩阵才是可逆的.如果您的矩阵不能被反转,也许您使用猜测和检查方法定义您的投影,而不是使用保证非破坏性变换的过程.

资源:

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