2016-07-24 139 views
0

我有一個python for循環,似乎有一個變量在循環內自己的變化。我的變量定義:變量內部循環自身變化

yhat = np.empty((1,len(prices))) 
yhat[:] = nan 
yhat = yhat.astype('float') 
e = Q = yhat 

P = R = np.matrix(np.zeros((2,2))) 
B = np.empty((2,len(prices))) 
B[:] = nan 
B = np.matrix(B) 

B[:,0] = 0 

的循環是:(prices是一個數據幀)

for t in xrange(0,len(prices),1): 

    if t > 0: 
     B[:,t] = B[:,t-1] 
     R = P+Vw 


    yhat[0,t] = x[t,:]*B[:,t] 
    print yhat[0,t] 

    Q[0,t] = x[t,:]*R*x[t,:].T + Ve 
    print yhat[0,t] 

    e[0,t] = y[t,0] - yhat[0,t] 
    print yhat[0,t] 

    K = (R*x[t,:].T)/Q[0,t] 

    B[:,t] = B[:,t]+K*e[0,t] 


    P = R - K*x[t,:]*R 

我打印的yhat,因爲我已經收窄異常的代碼到它。在設置了yhat @ t的值後,它似乎改變了。當我運行的代碼,它打印出:

0.0 
0.001 
20.438747 

另外,我很擔心減法爲e[0,t]因爲某種原因減法導致的yhat的價值在那當前時刻?

也許我錯過了一些明顯的東西。我對python比較新,我從MATLAB轉換過來。

編輯:x & y也是矩陣對象。所以所有的乘法都是矩陣點積。

回答

3

e = Q = yhat將不會創建副本。它們是對相同對象的附加引用。通過eQ名稱更改該對象也會反映在通過yhat參考顯示的更改中。

所以

yhat[0,t] = x[t,:]*B[:,t] 

Q[0,t] = x[t,:]*R*x[t,:].T + Ve 

e[0,t] = y[t,0] - yhat[0,t] 

所有操作是相同的,單個numpy陣列對象上,而不是在單獨的對象。

使用numpy.copy() function創建獨立的新副本,而不是:

e, Q = np.copy(yhat), np.copy(yhat) 
+0

美麗。現在卡爾曼濾波器像夢一樣工作。現在這只是一個粗糙的細微差別嗎?或者與熊貓數據框有相同的結果嗎? – denbjornen505

+1

@ denbjornen505:這是* Python *的細微差別;名稱是*標籤*,對一個對象的引用。您可以將任意數量的標籤附加到對象上。 –

+1

@ denbjornen505:參見http://nedbatchelder.com/text/names.html瞭解關於Python中的名稱如何工作的偉大文章和演示。 –