我在Python中编写了一个代码,用于根据数据创建转换概率矩阵,但是我一直在为两个特定的数据点获取错误的值。我花了几天时间试图弄清楚问题,但没有成功。
关于代码:输入是csv文件中的4列。在准备数据之后,前两列是新旧状态值。我需要计算每个旧状态值转移到新状态的频率(基本上,每对(x,y)在数据的前两列中出现的频率)。这些列中的值从0到99.在trans_pr矩阵中,我想得到一个数字(x,y)在数据中出现的频率,并在trans_pr中的相应坐标(x,y)处有这个数字矩阵。由于值从0到99,因此每次在数据中出现时,我只能在此坐标处将矩阵加1。
问题:代码工作正常,但我总是在坐标(:,29)和(:,58)和(29,:)和(58; :)上得到零,尽管有观察结果。有时似乎也会将此坐标处的数字添加到上一行。再一次,对我没有任何意义。
如果有人能提供帮助,我将非常感激。 (我是Python的新手,因此代码可能效率低下,但只有bug才有用。)
代码尽可能简单:
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 :(得分:4)
这听起来非常像一个四舍五入的问题。我想是的,例如100 * 0.29(作为浮点数)向下舍入(即截断),因此产生28而不是29.在将它们用作数组索引之前,尝试自己舍入数字(即向上/向下舍入)。
更新:通过测试验证了我的猜想,即使数字如上所述 - 请参阅here。
答案 1 :(得分: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