2013-01-10 27 views
3

我是相當新的Python和我想知道有什麼區別之間:SciPy的INV(A)VS AI

inv(A) 

A.I 

兩個返回一個包含一個numpy的陣列矩陣的倒數A

A.I在我看來,它正在訪問存儲矩陣逆矩陣類的變量;然而,這意味着每次更改A時,必須重新計算A的倒數(這對我來說似乎不合邏輯)。

回答

5

A.Inumpy.linalg.inv是不一樣的。

A.Iproperty它調用matrix.getI

def getI(self): 
    M,N = self.shape 
    if M == N: 
     from numpy.dual import inv as func 
    else: 
     from numpy.dual import pinv as func 
    return asmatrix(func(self)) 

所以getI任取決於的形狀numpy.dual.inv(正方形矩陣的乘法逆元素)或numpy.dual.pinv(穆爾 - 彭羅斯僞逆)調用矩陣。

如果跟蹤通過定義(在dual.py),你會發現, numpy.dual.invnumpy.linalg.invnumpy.dual.pinvnumpy.linalg.pinv

In [69]: s = np.random.random((3,4)) 

In [70]: t = np.matrix(s) 

In [71]: t.I 
Out[71]: 
matrix([[ 1.09509751, -0.56685735, 0.51704085], 
     [-1.59777153, 0.2777383 , 1.25579378], 
     [ 0.81899054, 0.7594223 , -0.82760378], 
     [ 0.02845906, 0.50418885, -0.2091376 ]]) 

In [72]: np.linalg.inv(t) 
... 
LinAlgError: Array must be square 

此外,np.linalg.inv可以應用於numpy的陣列(和返回numpy的陣列),以及可應用於numpy的矩陣。matrix.I屬性特定於numpy矩陣,並返回另一個numpy矩陣。

In [60]: x = np.random.random((3,3)) 

In [62]: y = np.matrix(x)  

In [64]: type(y.I) 
Out[64]: <class 'numpy.matrixlib.defmatrix.matrix'> 

In [65]: type(np.linalg.inv(x)) 
Out[65]: <type 'numpy.ndarray'> 

的屬性,像A.I看起來像語法的屬性,但它實際上調用一個函數(在這種情況下,A.getI)。所以倒數的值沒有被存儲。每次Python評估A.I時,都會調用函數A.getI(),並返回該函數的結果。

有關屬性的更多信息,請參閱Properties: attributes managed by get/set methods

+1

+1對於詳細的答案,儘管我不確定您是否已經強調過似乎是OP的主要關注點:儘管'AI'看起來像一個存儲值,但它每次訪問時都會進行計算它。所以對於方矩陣來說,它基本上是用於完全相同操作的語法糖。 – Jaime

+1

@Jamie:謝謝,我已經忘記了這部分問題。我最後補充了一點,希望能夠糾正這一點。 – unutbu

+0

謝謝!你的回答非常有幫助和簡潔!閱讀attrubutes和get/set方法。我不明白爲什麼找到矩陣的逆將使用get/set屬性。這似乎是合乎邏輯的,'xI()',我認爲'xI'更愉快,但是這意味着必須記住是否放置括號或不放置... –

2

根據您的Python和numpyI(以及類似T等)的版本,要麼是@property,或同樣的事情自定義實現。

如果你以前從未見過這樣的想法,你可以創建一個看起來像數據屬性(又稱「成員變量」)的東西,但每次訪問它時都會調用getter方法。

因此,每當您更改A時,都不會強制重新計算A.I,而是您每次訪問A.I時都需要重新計算A.I

當然,這可能不會更好,這取決於您的使用模式;它可能會更糟。但是,就像任何其他方法一樣,如果有幫助,沒有任何東西可以阻止記憶(緩存結果)。

在封面之下,A.I的吸氣劑是A.getI(),所以它們是等效的,兩者可能相當於inv(A)。 (具有免費功能foo(A)和方法A.foo()做同樣的事情是相當普遍的所有numpy。)除了,正如unutbu指出,有不止一種方法稱爲inv; A.I將等同於其中的一個,但不一定是您直接導入主名稱空間的那個。