【问题标题】:np.mean() vs np.average() in Python NumPy?Python NumPy 中的 np.mean() 与 np.average()?
【发布时间】:2013-12-01 23:37:27
【问题描述】:

我注意到了

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

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

但是,应该有一些区别,因为它们毕竟是两个不同的功能。

它们之间有什么区别?

【问题讨论】:

  • 实际上,据我所知,文档并没有立即说明。不是说无法判断,但我认为这个问题对 Stack Overflow 都是有效的。
  • numpy.mean :返回数组元素的平均值。
  • @joaquin:“计算沿指定轴的算术平均值。” vs“计算沿指定轴的加权平均值。”?
  • @Blender 对。我只是想对您的评论做出一种有趣的回应,因为如果我按照您的指示在docs for numpy.mean 中读到的第一件事是 numpy.mean :返回数组元素的平均值如果您正在寻找 OP 问题的答案,这很有趣。

标签: python numpy statistics average mean


【解决方案1】:

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.平均:

...
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 已经是可选的。似乎没有必要,只会让用户感到困惑。
  • @Geoff 我宁愿让他们为“平均值”抛出 NotImplementedException,以教育用户算术平均值与“平均值”不同。
【解决方案2】:

np.mean 总是计算算术平均值,并且有一些额外的输入和输出选项(例如,使用什么数据类型,将结果放在哪里)。

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

【讨论】:

    【解决方案3】:

    在某些版本的 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.ma.average 有效。另外,还有一个bug report
    【解决方案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(也具有适当的精度)。

    【讨论】:

    • 非常令人惊讶。您知道为什么会发生这种情况,您可以提交错误报告吗?谢谢
    • 你拯救了我的一天!
    【解决方案5】:

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

    average 可以计算加权平均值。

    文档链接:meanaverage

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 2014-12-08
      • 2019-09-11
      • 2021-09-08
      • 2016-11-29
      • 1970-01-01
      • 2020-04-17
      • 2015-07-16
      • 2012-06-10
      相关资源
      最近更新 更多