NumPy中np.average()和np.mean()的区别

4
NumPy有两个不同的函数用于计算平均值:
np.average()

并且

np.mean()

由于NumPy不太可能包含冗余特性,因此必须存在微妙的差异。

当我开始使用Python进行数据分析时,我对这个概念非常不清楚,所以我决定在这里提供详细的自我答案,因为我相信其他人也在苦苦挣扎。


你注意到这个问题已经存在了吗?请参见https://dev59.com/dGIj5IYBdhLWcg3wn2do - Warren Weckesser
1
@WarrenWeckesser - 是的,我之前在寻找答案时就遇到过这个问题。虽然那里的答案提供了两个函数的简要说明,但并没有解释太多关于“为什么”的内容,所以我感到更加困惑。我对 SO 上的元方法理解是,如果你想分享一个答案,最好以问答形式进行,而不是挖掘一个旧的问题线程来满足那个用户。我并不是想重新提问,只是想分享一个更深入的答案,帮助我克服一些理解上的挑战。 - AdamSC
2
问题实际上是一个完全重复的,如果您的答案添加到那里,对我来说更有意义,因为从“长期”来看,最好将所有答案放在一个地方。如果我谷歌搜索“numpy average vs mean”,我宁愿阅读一个stackoverflow页面而不是两个或更多页面。不过,我不会使用Mjölnir,即重复问题锤子。感谢您周到的回答! - Warren Weckesser
@WarrenWeckesser - 这是一个很公正的观点。我能够欣赏到这一点。下次我会在已有问题的基础上添加新的答案。感谢您的建设性反馈 :) - AdamSC
你也可以查看这个答案:https://dev59.com/dGIj5IYBdhLWcg3wn2do - Jeru Luke
您也可以查看这个答案:https://dev59.com/dGIj5IYBdhLWcg3wn2do - Jeru Luke
1个回答

9

简短回答:

“Mean”和“Average”是两个不同的概念,人们常常混用这两个词语,但实际上它们是不同的。使用np.mean()函数可以计算出算术平均值,而np.average()函数,如果你不添加其他参数,也可以计算出算术平均值,但同时还能计算加权平均值。

详细回答和背景:

统计学:

由于NumPy主要用于处理数据集,因此了解这种概念会导致混淆的数学概念非常重要。在简单的数学和日常生活中,我们经常使用“平均值”和“算术平均值”这两个词语互换使用,但实际上它们是不同的。

  • 算术平均值(Mean): 通常指“算术平均值”或者说是“一组数字总和除以该组数字的数量”1
  • 平均数(Average): 平均数可能涉及许多不同的计算方式,“算术平均数”只是其中一种。其他的包括“中位数”,“众数”,“加权平均数”,“四分位平均数”等等。2

NumPy中的区别:

回到本文主题。由于NumPy通常用于与数学相关的应用程序,因此它需要比像Excel这样使用Average()作为查找“算术平均值”的函数更加精确地区分average()和mean()之间的差异。

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() 更准确,因此了解这种统计学差异非常重要。

确实是重复的问题,但是答案却是最好的! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接