np.average()和np.mean()之间的NumPy差异
NumPy有两个不同的函数用于计算平均值:np.average()和np.mean()之间的NumPy差异,numpy,statistics,Numpy,Statistics,NumPy有两个不同的函数用于计算平均值: np.average() 及 因为NumPy不太可能包含冗余特性,所以它们之间的差异一定很细微 这是一个在Python中开始数据分析时我非常不清楚的概念,因此我决定在这里做一个详细的自我回答,因为我确信其他人正在努力解决这个问题。简短回答: “平均”和“平均”是两码事。人们可以互换使用,但不应该。np.mean()提供算术平均值,其中,如果不添加其他参数,则作为np.average()可以获得算术平均值,但也可以用于获取加权平均值 详细回答和背景:
np.average()
及
因为NumPy不太可能包含冗余特性,所以它们之间的差异一定很细微
这是一个在Python中开始数据分析时我非常不清楚的概念,因此我决定在这里做一个详细的自我回答,因为我确信其他人正在努力解决这个问题。简短回答: “平均”和“平均”是两码事。人们可以互换使用,但不应该。np.mean()提供算术平均值,其中,如果不添加其他参数,则作为np.average()可以获得算术平均值,但也可以用于获取加权平均值 详细回答和背景: 统计信息: 由于NumPy主要用于处理数据集,因此理解导致这种混淆的数学概念非常重要。在简单的数学和日常生活中,我们使用平均值和平均值作为可互换的词,但情况并非如此
- 平均值:通常指“算术平均值”或数字集合的总和除以集合中的数字数
- 平均值:平均值可以指许多不同的计算,其中“算术平均值”就是其中之一。其他包括‘中位数’、‘模式’、‘加权平均数’、‘四分位平均数’和许多其他
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