2011-05-22 38 views
3

我已經用Python編寫了一個代碼來創建數據的轉換概率矩陣,但是我一直在爲兩個特定的數據點收到錯誤的值。我花了好幾天的時間試圖找出問題,但沒有成功。創建矩陣時的Python bug

關於代碼:輸入是csv文件中的4列。在準備好數據之後,前兩列是新舊狀態值。我需要計算每個舊狀態值轉移到新狀態的頻率(基本上,每個對(x,y)在數據的前兩列中出現的頻率)。這些列中的值是從0到99.在trans_pr矩陣中,我想獲得一個數字,在數據中出現pair(x,y)的頻率,並且在trans_pr中的相應座標(x,y)處具有此數字矩陣。由於數值是從0到99,所以我可以在每次出現在數據中時在這個座標上加1。

問題:代碼工作正常,但我始終在座標(:,29)和(:,58)和(29,:)和(58; :)儘管有觀察值的零點。它有時似乎還將此座標處的數字添加到上一行。再次,對我來說沒有任何意義。

如果有人可以幫忙,我將不勝感激。 (我是新來的Python,因此代碼可能是低效的,但只有錯誤是相關的。)

的代碼很簡單,因爲它可以:

from numpy import * 
import csv 

my_data = genfromtxt('99c_test.csv', delimiter=',') 

"""prepares data for further calculations""" 
my_data1=zeros((len(my_data),4)) 
my_data1[1:,0]=100*my_data[1:,0] 
my_data1[1:,1]=100*my_data[1:,3] 
my_data1[1:,2]=my_data[1:,1] 
my_data1[1:,3]=my_data[1:,2] 
my_data2=my_data1 
trans_pr=zeros((101,101)) 
print my_data2 

"""fills the matrix with frequencies of observations""" 

for i in range(len(my_data2)): 
    trans_pr[my_data2[i,1],my_data2[i,0]]=trans_pr[my_data2[i,1],my_data2[i,0]]+1 

c = csv.writer(open("trpr1.csv", "wb")) 
c.writerows(trans_pr) 

你可以利用這個測試代碼輸入(只是將它保存爲csv文件):

p_cent,p_euro,p_euro_old,p_cent_old 
0.01,1,1,0.28 
0.01,1,1,0.29 
0.01,1,1,0.3 
0.01,1,1,0.28 
0.01,1,1,0.29 
0.01,1,1,0.3 
0.01,1,1,0.57 
0.01,1,1,0.58 
0.01,1,1,0.59 
0.01,1,1,0.6 
+0

是這種貨幣?我建議你看看'decimal' Python庫。 – Skurmedel 2011-05-22 11:48:42

回答

4

這聽起來很像一個四捨五入的問題。我假設例如將100 * 0.29(作爲浮點數)向下舍入(即截斷),從而得到28而不是29.在將它們用作數組索引之前,嘗試對自己進行四捨五入(即上/下舍入)。

更新:通過測試驗證了我的猜想,即使數字如上所述 - 請參閱here

+0

它已經工作。我懷疑這可能是python以奇怪的方式處理數字,但不知道該怎麼做。非常感謝你! – user764704 2011-05-22 12:26:58

4

您可能會發現rint()有用,從numpy。它將值舍入爲最接近的整數(請參閱numpy.rint() doc)。您是否嘗試過以下方法:

for i in range(len(my_data2)): 
    trans_pr[rint(my_data2[i,1]), rint(my_data2[i,0])] = \ 
     trans_pr[rint(my_data2[i,1]), rint(my_data2[i,0])] + 1 
+0

這不是一回事。 – katrielalex 2011-05-22 12:40:08

+0

對不起,你的意思是? – xgrg 2011-05-22 12:48:30

+0

對不起,不清楚。 'rint'不是我知道的Python函數;它不在內建的命名空間或「數學」中。 – katrielalex 2011-05-22 12:52:49