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

Python 为什么numpy.mean是无限的,而值是有限的?,python,numpy,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 = 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

x.mean
是一个内置的,因此我必须查看github以了解它是如何编码的。但最有可能的是直接求和,然后除以。但它确实可以处理axis和dtype等变化

我的猜测是,你的情况不经常出现,不值得特别处理。按大小进行常规分割不是一个好主意,因为这可能会导致精度下降。它涉及到通过数组的额外迭代。另一种方法是求和,然后检查是否有
inf
overflow
值,并使用缩放值重复该任务。这也会引起额外的迭代

但作为用户,您始终可以选择适当地缩放值。编码自己的
平均值
,使用缩放和求和是很容易的。如果你遇到了
inf
mean
问题,你可能会遇到这些数字的其他计算——任何涉及求和的计算——加权平均值、点、标准等。因此,你最好将这些值缩放一次,而不是期望每次计算都能为你完成

表明当您有意限制数据类型时(例如使用
dtype=np.float16
),这更可能是一个问题


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

刚刚在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()
,但我认为上面的方法可以更好地处理权重的舍入。

如果您先除法,然后求和,我相信复杂性会增加数组大小的一倍。我想问题是除法很昂贵。也许有可能检测到这种情况并选择适当的方法?这可能会更好地作为针对numpy的问题,因为您基本上已经诊断出问题和潜在的解决方案。与其说除法昂贵,不如说做N次手术比做1次差得多。中间点是先求和再除以小值,然后再除以再求和大值,即内置的
统计信息。平均值([8.988465674311579e+307,8.98846567431158e+307])
抛出一个
溢出错误
这里有几个用户提到了我的解决方案将带来的额外迭代/复杂性,但我不确定这是真的。以这个实现为例:
mean=0;对于x中的i:mean+=i/len(x)
。仍然
O(len(x))
def my_mean(x):
    return np.average(x, weights=np.ones_like(x) / x.size)