2013-11-28 23 views
0

我使用cumsum函数来计算csv列(行)的累积和。输入如下:csv行的Numpy累计和给出了类型错误

输入(average_):

1 0.000053 0.004531 0.010447 0.051962 
2 0.000589 0.004518 0.009801 0.052226 
3 0.000083 0.004581 0.010362 0.052288 
4 -0.000192 0.003726 0.011258 0.051094 
5 0.000281 0.004078 0.01008  0.052156 
6 0.000091 0.004028 0.009853 0.052301 
7 0.000478 0.004298 0.009966 0.054803 
8 0.00028  0.004267 0.010051 0.050296 
9 0.000198 0.004766 0.010245 0.051754 

但是这个代码:

acc_column = [] 
for row in average_: 
    f_column = numpy.cumsum(row[1], dtype = float) 
    acc_column.append(f_column) 

不工作,并给出了错误:

"TypeError: cannot perform accumulate with flexible type" 

任何想法请问我做错了什么?

回答

1

看起来像你的一些数据不是正确的dtype,试试这个(转换为float),它工作还是给另一个TypeError

f_column = numpy.cumsum(numpy.asarray(row[1], dtype=float)) 
+0

的循环现在可以正常工作,但不会产生输入数据! :s – PyLearner

2

我敢打赌,你有什么(即使你还没有告诉我们)是一个结构数组,像这样:

array([(1, 5.3e-05, 0.004531, 0.010447, 0.051962), 
     (2, 0.000589, 0.004518, 0.009801, 0.052226), 
     (3, 8.3e-05, 0.004581, 0.010362, 0.052288), 
     (4, -0.000192, 0.003726, 0.011258, 0.051094), 
     (5, 0.000281, 0.004078, 0.01008, 0.052156), 
     (6, 9.1e-05, 0.004028, 0.009853, 0.052301), 
     (7, 0.000478, 0.004298, 0.009966, 0.054803), 
     (8, 0.00028, 0.004267, 0.010051, 0.050296), 
     (9, 0.000198, 0.004766, 0.010245, 0.051754)], 
     dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')]) 

如果没有,那么你可以加载它

a = np.genfromtxt('tmp.txt', dtype=None) 

一旦这一切都在一个阵列中,有通过各行没有必要循环:用文件
如果你希望积累1列,那么这实际上场'f1'在结构数组,所以使用:

>>> np.cumsum(a['f1']) 
array([ 5.300e-05, 6.420e-04, 7.250e-04, 
     5.330e-04, 8.140e-04, 9.050e-04, 
     1.383e-03, 1.663e-03, 1.861e-03]) 

如果它是一个普通浮法阵列:

array([[ 1.000e+00, 5.300e-05, 4.531e-03, 1.0447e-02, 5.1962e-02], 
     [ 2.000e+00, 5.890e-04, 4.518e-03, 9.8010e-03, 5.2226e-02], 
     [ 3.000e+00, 8.300e-05, 4.581e-03, 1.0362e-02, 5.2288e-02], 
     [ 4.000e+00, -1.920e-04, 3.726e-03, 1.1258e-02, 5.1094e-02], 
     [ 5.000e+00, 2.810e-04, 4.078e-03, 1.0080e-02, 5.2156e-02], 
     [ 6.000e+00, 9.100e-05, 4.028e-03, 9.8530e-03, 5.2301e-02], 
     [ 7.000e+00, 4.780e-04, 4.298e-03, 9.9660e-03, 5.4803e-02], 
     [ 8.000e+00, 2.800e-04, 4.267e-03, 1.0051e-02, 5.0296e-02], 
     [ 9.000e+00, 1.980e-04, 4.766e-03, 1.0245e-02, 5.1754e-02]]) 

然后,所有你需要做的是对列调用cumsum

>>> np.cumsum(a[:,1]) 
array([ 5.300e-05, 6.420e-04, 7.250e-04, 
     5.330e-04, 8.140e-04, 9.050e-04, 
     1.383e-03, 1.663e-03, 1.861e-03]) 
+0

谢谢你,但我相信我的数据只是一个列表而不是np.array。它在上一步计算并保存在列表中,如下所示:“average_ = [],average_.append(float_means)”。我没有包括我的代码的其余部分,因为我认为它可能会使问题变得复杂。 – PyLearner

+1

@PLeLearner,将列表列表转换为数组可能是值得的,这样你就可以用它做出很好的numpy事情。如果你发布更多的代码,我可以看看它。 – askewchan

+0

太棒了!我试过了,它让生活变得更轻松!我将我的列表保存到np.array中,然后使用cumsum。 'average_ = np.array(average_,dtype = np.float),cum_sum = cumsum(average_ [:, 1]),com_arrays = append(zip(average_),cum_sum)'。但是,当我使用np.savetxt时,它会将所有内容都写入一个列中,而我希望将cum_sum元素添加到average_的每一行中。任何想法如何?或者我把它作为一个新问题发布,然后你在那里回答? – PyLearner

相关问题