2012-06-06 8 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

関連する問題