为什么numpy.mean无限,而值是有限的?

时间:2016-11-25 11:14:46

标签: python numpy

当我遇到以下

时,我正在玩假设
>>> x = np.array([8.988465674311579e+307, 8.98846567431158e+307])
>>> x
array([  8.98846567e+307,   8.98846567e+307])
>>> x.mean()
inf

是否会发生这种情况,因为元素的总和是inf

>>> x.sum()
inf

如果是这样,为什么numpy不会先划分,总结之后呢?

>>> (x/len(x)).sum()
8.9884656743115795e+307

2 个答案:

答案 0 :(得分:2)

x.mean是内置的,所以我必须查看github,看看它是如何编码的。但最有可能的是直接的和之后是分歧。但它确实处理了像axis和dtype这样的变化。

我的猜测是你的病例经常不足以值得特别对待。按尺寸进行常规划分并不是一个好主意,因为这会导致精度损失。它涉及通过阵列的额外迭代。替代方法是执行求和,然后检查是否有infoverflow值,并使用缩放值重复任务。这也引发了额外的迭代。

但是您作为用户始终可以选择适当地缩放您的值。使用缩放后跟sum来编码您自己的mean很容易。如果您使用inf遇到mean问题,那么您可能会使用这些数字进行其他计算 - 涉及求和的任何内容 - 加权平均值,点数,标准等等。所以您可能会将值缩放一次,而不是期望每个计算都为你做。

Why does "numpy.mean" return 'inf'? 表示当你故意限制dtype时,这更有可能是一个问题(例如dtype=np.float16)。

In [361]: x=np.array([6550]*1000,dtype=np.float16)
In [362]: x.mean()
Out[362]: inf
In [363]: x.mean(dtype=float)
Out[363]: 6552.0

np.mean文档谈论dtype的选择和潜在的精确度损失。他们也可以提到溢出问题。

答案 1 :(得分:0)

刚刚在关于numpy的问题页面上发表了评论,但我想我也会在这里发帖。

以下应该可以正常工作,而不失一般性,并且numpy.mean的计算速度非常快:

def my_mean(x):
    return np.average(x, weights=np.ones_like(x) / x.size)

你修复np.mean的方法是预先乘以1 / n - 使用np.average的权重可以做到这一点而不会失去一般性。

你也可以做(x/len(x)).sum(),但我认为上面会更好地处理权重的舍入。

相关问题