np.average() 和 np.mean() 之间的 NumPy 区别 [重复]

Posted

技术标签:

【中文标题】np.average() 和 np.mean() 之间的 NumPy 区别 [重复]【英文标题】:NumPy Difference Between np.average() and np.mean() [duplicate] 【发布时间】:2016-11-11 07:17:55 【问题描述】:

NumPy 有两个不同的函数来计算平均值:

np.average()

np.mean()

由于 NumPy 不太可能包含冗余功能,因此它们必须是细微差别。

这是我在开始用 Python 进行数据分析时非常不清楚的一个概念,所以我决定在这里做一个详细的自我回答,因为我相信其他人正在努力解决这个问题。

【问题讨论】:

您注意到问题已经存在了吗?见***.com/questions/20054243/… @WarrenWeckesser - 是的,我之前在自己寻找答案时遇到过这个问题。虽然那里的答案提供了关于这两个功能的简要说明,但并没有解释太多“为什么”,所以我更加困惑。我对 SO 的元方法的理解是,如果你想分享一个答案,你最好采用 Q/A 风格,而不是挖掘一个让该用户满意的旧问题线程。不想重新提出问题,只是想分享一个更深入的答案,帮助我克服自己理解这一点的一些挑战。 这个问题实际上是一个完全重复的问题,如果你的答案被添加在那里对我来说更有意义,因为从长期来看,似乎最好将所有答案集中在一处。如果我用谷歌搜索“numpy average vs mean”,我宁愿阅读一个 stackoverlow 页面而不是两个或更多。不过, 不会是调用 Mjölnir 的那个人,即欺骗之锤。感谢您的周到回答! @WarrenWeckesser - 这是一个公平的观点。我很感激。下次我会为现有问题添加新的答案。感谢您的建设性反馈:) 你也可以看看这个答案:***.com/questions/20054243/… 【参考方案1】:

简答

'Mean' 和 'Ave​​rage' 是两个不同的东西。人们可以互换使用它们,但不应该。 np.mean() 为您提供算术平均值,而 np.average() 允许您在不添加其他参数的情况下获得算术平均值,但也可以用于取加权平均值。

长答案和背景

统计:

由于 NumPy 主要用于处理数据集,因此了解导致这种混淆的数学概念非常重要。在简单的数学和日常生活中,我们使用 AverageMean 作为可互换的词,但情况并非如此。

平均值:通常指“算术平均值”或一组数字的总和除以该集合中的数字个数1 平均:平均可以指许多不同的计算,“算术平均值”就是其中之一。其他包括“中位数”、“众数”、“加权平均数”、“四分位距平均数”等等。2

这对 NumPy 意味着什么:

回到手头的话题。由于 NumPy 通常用于与数学相关的应用程序,它需要比 Excel 等工具更精确地了解 Average() 和 Mean() 之间的差异,这些工具使用 Average() 作为查找“算术平均值”的函数。

np.mean()

在 NumPy 中,np.mean() 将允许您计算指定轴上的“算术平均值”。

您将如何使用它:

myArray = np.array([[3, 4], [5, 6]])
np.mean(myArray)

还有一些参数用于更改使用的 dType 以及函数应沿哪个轴计算(默认为展平数组)。

np.average()

np.average() 另一方面,您可以采用“加权平均值”,其中数组中的不同数字可能具有不同的权重。例如,在文档中我们可以看到:

>>> data = range(1,5)
>>> data
[1, 2, 3, 4]
>>> np.average(data)
2.5
>>> np.average(range(1,11), weights=range(10,0,-1))
4.0

对于最后一个函数,如果您采用非加权平均值,您会期望答案为 6。但是,它最终为 4,因为我们也应用了权重。

如果您对“加权平均值”没有很好的理解,我们可以尝试简化它:

认为这是我们的“加权平均值”的一个非常基本的总结,它在数学上不会非常准确(我希望有人会纠正),但它应该能让您可视化我们正在讨论的内容。

平均值是所有数字相加并除以数字总数的平均值。这意味着它们都具有相同的权重,或者只计算一次。对于我们的平均样本,这意味着:

(1+2+3+4+5+6+7+8+9+10+11)/11 = 6

加权平均值包括包含不同权重的数字。由于在我们上面的示例中,它不包含整数,因此可视化可能会有点混乱,因此我们可以想象加权更适合数字,它看起来像这样:

(1+1+1+1+1+1+1+1+1+1+1+2+2+2+2+2+2+2+2+2+3+3+3+3+3+3+3+3+4+4+4+4+4+4+4+5+5+5+5+5+5+6+6+6+6+6+6+7+7+7+7+7+8+8+8+8+9+9+9+-11)/59 = 3.9~

尽管在实际数字集中只有一个数字 1 的实例,但我们以正常重量的 10 倍计算它。这也可以用另一种方式来完成,我们可以按正常重量的 1/3 计算一个数字。

如果您不向 np.average() 提供权重参数,它只会为您提供与 np.mean() 等效的扁平轴上的相等加权平均值。

我为什么要使用 np.mean()?

如果 np.average() 可用于求平均算术平均值,那么您可能会问自己“我为什么要使用 np.mean()?” np.mean() 允许 np.average() 不允许的一些有用参数。其中一个关键参数是 dType 参数,它允许您设置计算中使用的类型。

例如,NumPy 文档给了我们这个案例:

Single point precision: 
>>> a = np.zeros((2, 512*512), dtype=np.float32)
>>> a[0, :] = 1.0
>>> a[1, :] = 0.1
>>> np.mean(a)
0.546875 

根据上面的计算,我们的平均值似乎是 0.546875,但如果我们使用 dType 参数来 float64,我们会得到不同的结果:

>>> np.mean(a, dtype=np.float64)
0.55000000074505806

实际平均值0.55000000074505806

现在,如果您将这两个数字四舍五入到两位有效数字,则在这两种情况下都会得到 0.55。这种准确性变得重要的地方是,如果您仍然对数字进行多组运算,尤其是在处理需要高精度的非常大(或非常小的数字)时。

例如:

(((((0.55000000074505806*184.6651)^5)+0.666321)/46.778) = 231,044,656.404611

(((((0.55000000074505806*184.6651)^5)+0.666321)/46.778) = 231,044,654.839687

即使在更简单的方程式中,您最终也可能会出现小数点后的偏差,这可能与以下相关:

科学模拟:由于方程冗长、步骤多且需要高精度。 统计数据:几个百分点的准确度差异可能至关重要(例如在医学研究中)。 财务:在大型财务模型中或在跟踪大量资本(银行/私募股权)时持续下降几美分,到年底可能会导致数十万美元的错误。

重要词区别 最后,简单地解释一下,您可能会发现自己处于分析数据的情况,要求您找到数据集的“平均值”。您可能希望使用不同的平均方法来找到数据集的最准确表示。例如,在有异常值的情况下,np.median() 可能比 np.average() 更准确,因此了解统计差异很重要。

【讨论】:

以上是关于np.average() 和 np.mean() 之间的 NumPy 区别 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Numpy 均值无法获取其他轴

np.mean 和 tf.reduce_mean 有啥区别?

numpy 常用工具函数 —— np.bincount/np.average

numpy 常用工具函数 —— np bincount/np average

带有 np.mean 的大列表的平均值

自定义 numpy 类型导致 numpy.mean 崩溃