【发布时间】:2011-12-22 04:11:02
【问题描述】:
我是 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 万个元素)。有什么办法可以解决这个问题吗?
如果有人可以帮助我,我将不胜感激。
【问题讨论】:
-
math.fsum(total)是否返回0? -
是的!哇!!!你的意思是我根本不应该使用 numpy,我误以为 numpy 是处理数组的最佳工具!!!但是查看docs.python.org/py3k/library/math.html#module-math 我没有看到任何计算标准偏差的工具。你有什么建议?
-
没有。
fsum()只是为了检查您的代码除了在求和过程中失去精度之外没有其他错误。numpy.std()可用于标准偏差。试试np.std(total, dtype=np.float64)。 -
我猜你看到了溢出问题。注意
sum([1e308, 1, -1e308]) == 0.0和math.fsum([1e308, 1, -1e308]) == 1.0 -
它有助于在求和之前按绝对值对数据进行排序(尤其是在这种情况下,您希望正负贡献相互抵消)。它还有助于首先以块(例如 100000 左右)进行部分总和,然后将部分总和相加。