我注意到
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
然而,由于它们毕竟是两个不同的函数,应该会有一些区别。
它们之间有什么区别?
我注意到
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
然而,由于它们毕竟是两个不同的函数,应该会有一些区别。
它们之间有什么区别?
np.average接受一个可选的权值参数,如果未提供,则与np.mean等效。查看源代码: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
...
np.average
,因为 weights
已经是可选的了。这似乎是不必要的,只会让用户感到困惑。 - Geoffnp.mean
通常计算算术平均值,并具有一些用于输入和输出的其他选项(例如使用哪种数据类型,结果放在何处等)。
np.average
可以在提供了weights
参数的情况下计算加权平均值。
在某些版本的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
np.average
和np.mean
都考虑掩码。我已经尝试并得到了“Out: 2.0”的值。 - CEBnp.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
(以及适当的精度)。