np.average()和np.mean()之间的NumPy差异

np.average()和np.mean()之间的NumPy差异,numpy,statistics,Numpy,Statistics,NumPy有两个不同的函数用于计算平均值: np.average() 及 因为NumPy不太可能包含冗余特性,所以它们之间的差异一定很细微 这是一个在Python中开始数据分析时我非常不清楚的概念,因此我决定在这里做一个详细的自我回答,因为我确信其他人正在努力解决这个问题。简短回答: “平均”和“平均”是两码事。人们可以互换使用,但不应该。np.mean()提供算术平均值,其中,如果不添加其他参数,则作为np.average()可以获得算术平均值,但也可以用于获取加权平均值 详细回答和背景:

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

np.average()

因为NumPy不太可能包含冗余特性,所以它们之间的差异一定很细微


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

简短回答

“平均”和“平均”是两码事。人们可以互换使用,但不应该。np.mean()提供算术平均值,其中,如果不添加其他参数,则作为np.average()可以获得算术平均值,但也可以用于获取加权平均值

详细回答和背景

统计信息:

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

  • 平均值:通常指“算术平均值”或数字集合的总和除以集合中的数字数
  • 平均值:平均值可以指许多不同的计算,其中“算术平均值”就是其中之一。其他包括‘中位数’、‘模式’、‘加权平均数’、‘四分位平均数’和许多其他
这对NumPy意味着什么:

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

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

以下是您将如何使用它:

myArray = np.array([[3, 4], [5, 6]])
np.mean(myArray)
还有一些参数可用于更改使用的数据类型以及函数应沿哪个轴计算(默认为展平数组)

另一方面,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.average()?”np.average()允许使用一些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)= 231044,656.404611

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

即使在更简单的方程式中,也可能会出现小数点后几位的偏差,这可能与:

  • 科学模拟:由于需要冗长的方程式、多个步骤和高精度
  • 统计学:准确率的几个百分点之间的差异可能是至关重要的(例如在医学研究中)
  • 金融:在大型金融模型中,或在跟踪大量资本(银行/私人股本)时,持续亏损甚至几美分,到年底可能导致数十万美元的错误
重要词语区分
最后,简单地解释一下,您可能会发现自己在分析数据时被要求查找数据集的“平均值”。您可能希望使用不同的平均方法来查找数据集的最精确表示。例如,在有异常值的情况下,np.median()可能比np.average()更准确,因此了解统计差异很重要。

您注意到这个问题了吗
>>> np.mean(a, dtype=np.float64)
0.55000000074505806