NumPy 有两个不同的函数来计算平均值:
np.average()
Run Code Online (Sandbox Code Playgroud)
和
np.mean()
Run Code Online (Sandbox Code Playgroud)
由于 NumPy 不太可能包含冗余功能,因此它们必须是细微差别。
在开始使用 Python 进行数据分析时,这是一个我非常不清楚的概念,所以我决定在这里做一个详细的自我回答,因为我确信其他人正在为此苦苦挣扎。
简答:
' Mean '和' Average '是两个不同的东西。人们可以互换使用它们,但不应该。np.mean()为您提供算术平均值,而np.average()允许您在不添加其他参数的情况下获得算术平均值,但也可用于取加权平均值。
长答案和背景:
统计数据:
由于 NumPy 主要用于处理数据集,因此了解导致这种混淆的数学概念非常重要。在简单的数学和日常生活中,当情况并非如此时,我们使用“平均值”和“平均值”作为可互换的词。
这对 NumPy 意味着什么:
回到手头的话题。由于 NumPy 通常用于与数学相关的应用程序,因此与 Excel 等使用 Average() 作为查找“算术平均值”函数的工具相比,Average() 和 Mean() 之间的差异需要更精确一些。
在 NumPy 中, np.mean() 将允许您计算指定轴上的“算术平均值”。
以下是您将如何使用它:
myArray = np.array([[3, 4], [5, 6]])
np.mean(myArray)
Run Code Online (Sandbox Code Playgroud)
还有一些参数可用于更改使用的 dType 以及函数应沿哪个轴计算(默认为展平数组)。
另一方面, 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() 更准确,因此了解统计差异很重要。
归档时间: |
|
查看次数: |
3406 次 |
最近记录: |