Python NumPy中的np.mean()与np.average()有何区别?

259

我注意到

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

然而,由于它们毕竟是两个不同的函数,应该会有一些区别。

它们之间有什么区别?


28
就我所看,这份文档并没有直接说明。虽然我不是说无法判断,但我认为这个问题仍然适用于Stack Overflow。 - BlackVegetable
1
numpy.mean:返回数组元素的平均值。 - joaquin
2
@joaquin:沿着指定的轴计算算术平均值,还是计算加权平均值? - Blender
@Blender没错。我只是想对你的评论做出一种有趣的回应,因为如果我按照你的指示去看numpy.mean文档,第一件要读的事情是“numpy.mean: 返回数组元素的平均值”,这对于寻找OP问题的答案来说是很有趣的。 - joaquin
5个回答

234

np.average接受一个可选的权值参数,如果未提供,则与np.mean等效。查看源代码:MeanAverage

np.mean:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np.average:

...
if weights is None :
    avg = a.mean(axis)
    scl = avg.dtype.type(a.size/avg.size)
else:
    #code that does weighted mean here

if returned: #returned is another optional argument
    scl = np.multiply(avg, 0) + scl
    return avg, scl
else:
    return avg
...

82
为什么它们提供了两个不同的函数?似乎他们应该只提供 np.average,因为 weights 已经是可选的了。这似乎是不必要的,只会让用户感到困惑。 - Geoff
12
@Geoff,我宁愿让它抛出“NotImplementedException”异常来告诉用户算术平均值不等同于“平均数”,以此来教育用户。 - FooBar
@Geoff 这个回答和那个回答实际上告诉你为什么需要这两个函数。 - undefined

48

np.mean 通常计算算术平均值,并具有一些用于输入和输出的其他选项(例如使用哪种数据类型,结果放在何处等)。

np.average 可以在提供了weights参数的情况下计算加权平均值。


32

在某些版本的numpy中还有一个您必须了解的重要区别:

average不考虑掩码,因此计算整个数据集的平均值。

mean 考虑掩码,因此仅计算未掩码值的平均值。

g = [1,2,3,55,66,77]
f = np.ma.masked_greater(g,5)

np.average(f)
Out: 34.0

np.mean(f)
Out: 2.0

3
注意:np.ma.average是可行的。同时,存在一个错误报告 - Neil G
2
np.averagenp.mean都考虑掩码。我已经尝试并得到了“Out: 2.0”的值。 - CEB
@CEB 新版本可能修复了这个错误,感谢您的报告。 - G M

13
除了已经提到的区别外,我刚刚发现了另一个非常重要的区别,与np.mean不同,np.average不允许使用必要的关键字dtype,这在某些情况下对于获取正确结果是至关重要的。我有一个非常大的单精度数组,它是从一个h5文件中读取的。如果我沿着0和1轴取平均值,除非我指定dtype='float64',否则我会得到极其不准确的结果:
>T.shape
(4096, 4096, 720)
>T.dtype
dtype('<f4')

m1 = np.average(T, axis=(0,1))                #  garbage
m2 = np.mean(T, axis=(0,1))                   #  the same garbage
m3 = np.mean(T, axis=(0,1), dtype='float64')  # correct results

遗憾的是,除非您知道要查找什么,否则您不能确定结果是否错误。因此,我再也不会使用np.average,而是在任何大型数组上始终使用np.mean(.., dtype='float64')。如果我想要加权平均值,我将使用权重向量和目标数组的乘积明确计算它,然后根据需要使用np.sumnp.mean(以及适当的精度)。


1
非常令人惊讶。你知道为什么会发生这种情况吗?你能否提交一个错误报告?谢谢。 - Sanjay Manohar

4
在您的调用中,这两个函数是相同的。
虽然mean可以计算加权平均值。
文档链接:meanaverage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接