python numpy中的长(> 2000万元素)数组求和

时间:2011-12-22 04:11:03

标签: python numpy

我是python和numpy的新手所以请原谅我这个问题是如此简陋! 我有一个负值数组(已排序):

>>>neg
[ -1.53507843e+02  -1.53200012e+02  -1.43161987e+02 ...,  -6.37326136e-1 -3.97518490e-10  -3.73480691e-10]
>>>neg.shape
(12922508,)

我需要将此数组添加到其副本(但具有正值),以找到平均分布的标准偏差为零。所以我做了以下几点:

>>>pos=-1*neg
>>>pos=pos[::-1] #Just to make it look symmetric for the display bellow!
>>>total=np.hstack((neg,pos))
>>>total
[-153.50784302 -153.20001221 -143.1619873  ...,  143.1619873   153.20001221  153.50784302]
>>>total.shape
(25845016,)

到目前为止一切都很好,但奇怪的是这个新数组的总和不是零:

>>>numpy.sum(total)
11610.6

标准偏差也完全没有达到我的预期,但我猜这个问题的根源是这样的:为什么总和不会导致零?

当我将此方法应用于小数组时;例如[-5,-3,-2],总和变为零。所以我猜问题在于数组的长度(超过2000万个元素)。有什么方法可以解决这个问题吗?

如果有人能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:3)

正如评论中所指出的那样,通过汇总数百万个等号数字,你会得到浮点数的问题。解决这个问题的一种可能方法是在组合数组中混合正数和负数,这样在求和时任何中间结果总是保持在大致相同的数量级:

neg = -100*numpy.random.rand(20e6)
pos = -neg
combined = numpy.zeros(len(neg)+len(pos))
combined[::2] = neg
combined[1::2] = pos

现在combined.sum()应该非常接近于零。

也许这种方法也有助于提高标准偏差计算的精确度。