Python NumPy中的np.mean()vs np.average()?

时间:2013-11-18 17:43:31

标签: python numpy statistics average mean

我注意到了

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

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

然而,应该存在一些差异,因为毕竟它们是两个不同的功能。

它们之间有什么区别?

5 个答案:

答案 0 :(得分:151)

np.average采用可选的权重参数。如果没有提供它们是等效的。请查看源代码: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
...

答案 1 :(得分:21)

np.mean总是计算算术平均值,并且还有一些输入和输出的附加选项(例如,要使用的数据类型,放置结果的位置)。

如果提供np.average参数,

weights可以计算加权平均值。

答案 2 :(得分:18)

在某些版本的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 :(得分:4)

除了已经指出的差异之外,还有另一个非常重要的差异,我刚刚发现了困难的方法:与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的乘积来显式计算。 / p>

答案 4 :(得分:2)

在你的调用中,两个函数是相同的。

average可以计算加权平均值。

文档链接:meanaverage