python numpy中的长(> 2000万元素)数组求和
问题内容:
我是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万个元素)。有什么办法可以解决这个问题?
如果有人能帮助我,我将不胜感激。
问题答案:
如注释中所述,通过对数百万个等号的数字求和会产生浮点取整问题。解决此问题的一种可能方法是在组合数组中混合正数和负数,以便在求和时得到的任何中间结果始终大致保持在相同的数量级内:
neg = -100*numpy.random.rand(20e6)
pos = -neg
combined = numpy.zeros(len(neg)+len(pos))
combined[::2] = neg
combined[1::2] = pos
现在combined.sum()
应该几乎为零。
也许这种方法也将有助于提高标准偏差的计算精度。