2012-06-06 85 views
6

我在python中使用基本的快捷方法時出現了一個非常奇怪的錯誤。看來,除非我是非常愚蠢的,我得到不同的值,A = A + B和A + = B.這裏是我的代碼:Python numpy添加錯誤

def variance(phi,sigma,numberOfIterations): 
    variance = sigma 
    for k in range(1,numberOfIterations): 
     phik = np.linalg.matrix_power(phi,k) 
     variance = variance + phik*sigma*phik.T 
    return variance 

這基本上只是計算向量自迴歸的協方差。因此,對於:

phi = np.matrix('0.7 0.2 -0.1; 0.001 0.8 0.1; 0.001 0.002 0.9') 
sigma = np.matrix('0.07 0.01 0.001; 0.01 0.05 0.004; 0.001 0.004 0.01') 

我得到:

variance(phi,sigma,10) = 
[[ 0.1825225 0.07054728 0.00430524] 
[ 0.07054728 0.14837229 0.02659357] 
[ 0.00430524 0.02659357 0.04657858]] 

這是正確的,我相信(用Matlab同意)。現在,如果我改變上面

variance += phik*sigma*(phik.T) 

我得到的線:

variance(phi,sigma,10) = 
[[ 0.34537165 0.20258329 0.04365378] 
[ 0.20258329 0.33471052 0.1529369 ] 
[ 0.04365378 0.1529369 0.19684553]] 

回事請告訴我?

非常感謝

+1

'A = A .__添加__(B)'='A = A .__ IADD __(B)'如果A是可變的 – JBernardo

+0

這也是一種奇怪的有一個變量的範圍你函數與函數具有相同的名稱。 –

回答

7

罪魁禍首是:

variance = sigma 

如果更改到:

variance = sigma.copy() 

你會看到正確的結果。

這是因爲+=實際進行(更有效的)就地另外...而且,由於這兩個variancesigma參考相同的陣列中,兩個將被更新。例如:

>>> sigma = np.array([1]) 
>>> variance = sigma 
>>> variance += 3 
>>> sigma 
array([4]) 
+0

謝謝,非常感謝! – Dan