2012-06-06 15 views
6

मुझे पायथन में एक बुनियादी शॉर्टकट विधि का उपयोग कर एक बहुत ही अजीब त्रुटि मिल रही है। ऐसा लगता है, जब तक कि मैं बहुत मूर्ख जा रहा हूँ, मैं एक = ए + बी के लिए अलग मान मिलता है, और ए + = बी यहाँ मेरी कोड है:पायथन 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 

यह मूलतः सिर्फ एक वेक्टर autoregression की सहप्रसरण की गणना करता है । तो के लिए:

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

'एक = एक .__ __ (बी) को जोड़ने के' = 'एक = एक .__ iadd __ (बी)' अगर एक परिवर्तनशील – JBernardo

+0

है यह भी के दायरे में एक चर के लिए एक तरह से अजीब है आपके फ़ंक्शन के समान नाम के साथ कार्य करें। –

उत्तर

7

दोषी है:

variance = sigma 

आप को बदलते हैं कि करने के लिए:

variance = sigma.copy() 

आप सही परिणाम देखेंगे।

इसका कारण यह है += वास्तव में एक (और अधिक कुशल) में जगह अलावा करता है ... और दोनों variance और sigma संदर्भ में एक ही सरणी, के बाद से दोनों अद्यतन किया जाएगा है। उदाहरण के लिए:

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

धन्यवाद, बहुत सराहना की! – Dan