我注意到了
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
然而,应该存在一些差异,因为毕竟它们是两个不同的功能。
它们之间有什么区别?
答案 0 :(得分:151)
np.average采用可选的权重参数。如果没有提供它们是等效的。请查看源代码:Mean,Average
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.sum
或np.mean
的乘积来显式计算。 / p>
答案 4 :(得分:2)