2014-02-07 205 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. ]])