2014-02-07 169 views
20

我想用numpy来计算逆矩阵。但我发现了一个错误:使用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。

+1

也对其他答案进行了评论,但是您必须将x定义为矩阵'np.matrix(x)',以便'.I'方法可用。 – M4rtini

回答

21

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 

另外,如果你想通过所有的3x3矩阵与[0,10)绘制的元素,你想要的以下内容:

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

而非combinations_with_replacement,否则你会跳过矩阵像使用Python和numpy的一个矩阵的

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

'模块'对象没有属性inv ... =/ –

+0

@JakeZ:我忘了'linalg'。回答编辑。 – user2357112

+0

是的,我试过了,我得到了'单数矩阵'错误。 O_O –

1

inv怎么样?

例如为: my_inverse_array = INV(my_array)

+0

我试过,但我得到'奇异矩阵'的错误......最有可能是因为它的扁平化....我不知道是否有一种方法来重塑它回到其原始状态,然后反向呢? –

+0

它可能更容易隐藏它的原始状态,然后再引用它,就像包含当前状态的对象和一个说明它最初是什么的属性一样。 numpy.linalg.lstsq会尝试给你一个最小二乘解决方案,但我不知道任何特别干净的东西。 – user1330052

2

逆:

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

解决奇异矩阵问题:

的try-catch奇异矩阵异常,并继续下去,直到你找到一个变换,满足您之前的标准,也可反转。

直觉与ELI5周围矩阵求逆和为什么有时候不能完成:

设想一个电影胶片投影仪上膜照明亮的光到白色壁,在凝结膜的像素是“投影”到墙上的像素。

我停止在单个框架上的电影投影,并且您看到白色墙壁上的像素,并要求您重新生成投影它的电影。这很容易,只需要执行投影的矩阵的逆。矩阵的逆矩阵可以消除投影。

现在想象一下,如果投影机已损坏,并且胶片上的多个像素投射到墙上的相同位置。然后我要求你“用矩阵求逆来撤销这个操作”。你说:“我不能,信息在投影中被摧毁,我无法回到我们所在的位置,因为矩阵是单数或退化的。”

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

来源:

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

3

另一种方式来做到这一点是使用numpy matrix class(而不是numpy的阵列)和I属性。例如:

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