【问题标题】:Python bug when creating matrices创建矩阵时的 Python 错误
【发布时间】:2011-05-22 21:03:46
【问题描述】:

我已经用 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

【问题讨论】:

  • 这是货币吗?我建议你看看decimal Python 库。

标签: python matrix


【解决方案1】:

这听起来很像一个四舍五入的问题。我想,例如100*0.29(作为浮点数)向下舍入(即截断),因此产生 28 而不是 29。在将数字用作数组索引之前,请尝试自行四舍五入(即向上/向下舍入)。

更新:通过测试验证了我的猜想,即使是数字也如上所述 - 请参阅here

【讨论】:

  • 成功了。我怀疑这可能与 python 以一种奇怪的方式处理数字有关,但不知道该怎么做。非常感谢!
【解决方案2】:

您可能会发现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

【讨论】:

  • 抱歉,不清楚。 rint 不是我所知道的 Python 函数;它不在内置命名空间或math 中。
  • 你是对的,它不在内置命名空间中,也不在math 中,而是来自numpy。由于一开始是导入的,所以我认为它可以使用。现在在我的回答中添加这个细节,谢谢。
猜你喜欢
  • 2013-01-09
  • 2015-10-12
  • 1970-01-01
  • 2022-12-08
  • 2016-12-13
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多