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

Sib*_*ing 170 python statistics numpy average mean

我注意到了

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

In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Run Code Online (Sandbox Code Playgroud)

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

它们之间有什么区别?

Ham*_*mer 167

np.average采用可选的权重参数.如果没有提供它们是等效的.看一下源代码:Mean,Average

np.mean:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)
Run Code Online (Sandbox Code Playgroud)

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
...
Run Code Online (Sandbox Code Playgroud)

  • 为什么他们提供两种不同的功能?似乎他们应该只提供`np.average`,因为`weights`已经是可选的.似乎没必要,只会让用户感到困惑. (56认同)
  • @Geoff我宁愿让他们为"average"抛出NotImplementedException,以教育用户算术平均值与"平均值"不同. (5认同)

Amb*_*ber 24

np.mean 始终计算算术平均值,并为输入和输出提供一些附加选项(例如,要使用的数据类型,放置结果的位置).

np.average如果weights提供参数,则可以计算加权平均值.


G M*_*G M 19

在某些版本的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
Run Code Online (Sandbox Code Playgroud)

  • 注意:“np.ma.average”有效。另外,还有一个[错误报告](https://github.com/numpy/numpy/issues/7330)。 (3认同)
  • `np.average` 和 `np.mean` 都考虑了掩码。我尝试过并得到了“Out: `2.0`”的值 (2认同)

Gra*_*tty 9

除了已经注意到的差异之外,还有另一个非常重要的差异,我刚刚发现了它的艰难方式:不同np.meannp.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
Run Code Online (Sandbox Code Playgroud)

不幸的是,除非您知道要查找什么,否则您不一定能判断出您的结果是错误的。np.average由于这个原因,我永远不会再使用,但将始终np.mean(.., dtype='float64')在任何大型阵列上使用。如果我想的加权平均,我会计算它明确地使用权重向量的乘积和所述目标阵列,然后或者np.sumnp.mean酌情(具有适当的精度以及)。