np.average() 和 np.mean() 之间的 NumPy 区别

Ada*_*mSC 4 statistics numpy

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

np.average()
Run Code Online (Sandbox Code Playgroud)

np.mean()
Run Code Online (Sandbox Code Playgroud)

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

在开始使用 Python 进行数据分析时,这是一个我非常不清楚的概念,所以我决定在这里做一个详细的自我回答,因为我确信其他人正在为此苦苦挣扎。

Ada*_*mSC 7

简答

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

长答案和背景

统计数据:

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

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

这对 NumPy 意味着什么:

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

np.mean()

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

以下是您将如何使用它:

myArray = np.array([[3, 4], [5, 6]])
np.mean(myArray)
Run Code Online (Sandbox Code Playgroud)

还有一些参数可用于更改使用的 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

(1+2+3+4+5+6+7+8+9+10+11)/11 = 6
Run Code Online (Sandbox Code Playgroud)

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

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

即使在实际的数字集中只有一个数字 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 
Run Code Online (Sandbox Code Playgroud)

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

>>> np.mean(a, dtype=np.float64)
0.55000000074505806
Run Code Online (Sandbox Code Playgroud)

实际平均值0.55000000074505806

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

例如:

((((0.55000000074505806*184.6651)^5)+0.666321)/46.778) = 231,044,65 6 .404611

((((0.55000000074505806*184.6651)^5)+0.666321)/46.778) = 231,044,65 4 .839687

即使在更简单的方程中,您最终也可能会偏离几个小数位,这可能与以下方面有关:

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

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