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

8 投票
1 回答
921 浏览
提问于 2025-04-17 08:49

我刚接触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 个回答

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() 的结果应该会非常接近零。

也许这种方法还可以帮助提高标准差计算的精度。

撰写回答