我是python和numpy的新手所以请原谅我,如果这个问题是如此简陋!我有一个负值数组(它已排序):
>>>neg
[ -1.53507843e+02 -1.53200012e+02 -1.43161987e+02 ..., -6.37326136e-1 -3.97518490e-10 -3.73480691e-10]
>>>neg.shape
(12922508,)
Run Code Online (Sandbox Code Playgroud)
我需要将此数组添加到其副本(但具有正值)以查找分布的标准偏差平均为零.所以我做了以下事情:
>>>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,)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,但奇怪的是这个新数组的总和不是零:
>>>numpy.sum(total)
11610.6
Run Code Online (Sandbox Code Playgroud)
标准偏差也完全没有达到我的期望值,但我猜这个问题的根源与此相同:为什么总和不会导致零?
当我将这个方法应用于一个小数组时; 例如[-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
Run Code Online (Sandbox Code Playgroud)
现在combined.sum()应该非常接近于零。
也许这种方法也将有助于提高标准差计算的精度。
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |