在统计学中,平均数是一种常用的衡量数据集中趋势的指标。对于平均数来说,它具有以下性质:
- 平均数是一组数据的均衡点,等于所有数据的总和除以数据个数,它能反映数据的中心位置。
- 平均数对极端值敏感,任一数据点的变化都会影响平均值。
- 当数据服从对称分布时,平均数与中位数、众数重合;对于偏态分布,平均数会偏向极端值方向。
NumPy 求平均数函数
在 NumPy 中,我们可以使用 mean() 函数来计算数组的算术平均数。
语法:
numpy.mean(
arr,
axis=None,
dtype=None,
out=None,
keepdims=False,
where=True
)说明:
mean() 函数接收以下参数。
arr(必选):是一个数组。axis(可选,默认:None):指定沿哪个轴计算平均值。- 当取值为 None 时,表示对整个数组求平均值(结果是一个数)。
- 对于二维数组来说:
axis=0:表示按 “列” 来计算平均值(每一列算一个平均数,沿着 “竖着” 的方向)。axis=1:表示按 “行” 来计算平均值(每一行算一个平均数,沿着 “横着” 的方向)。- 如果是元组:比如 axis=(0, 1),此时表示一次在多个轴上求平均值。
dtype(可选,默认:None):指定计算时的数据类型。如果不填,NumPy 会自动选择合适的类型,比如:- 整数类型通常会自动升级为 float64 以保证精度。
- 浮点类型会保持原来的类型。
out(可选,默认:None):表示把结果存到已有数组中,而不是新建一个数组。这样在某些情况下,可以提高性能。keepdims(可选,默认:False):是否保留被压缩的维度。如果设置为 True,被缩减的轴保留为长度 1 的维度,确保输出与原数组维度一致。where(可选):是一个布尔数组或条件表达式。只有 where 中为 True 的元素才会被包含在平均值的计算中。
提示:
- 如果数组中包含非数值类型(如字符串)的元素,则会触发 TypeError 异常。
- 如果只是想快速求整个数组的平均值,我们直接用 np.mean(arr) 就行。
- axis 是最容易出错的地方,建议小伙伴们多画图或打印数组的形状来理解。
NumPy 求平均数示例
接下来,我们通过几个简单的例子来讲解一下 NumPy 是如何求平均数的。
示例 1:一维数组的平均值
import numpy as np
arr = np.array([2, 4, 6, 8])
result = np.mean(arr)
print(result) 运行结果如下。
5.0分析:
对于 np.mean(arr) 来说,它会计算所有元素之和(即 20),然后除以元素个数(即 4),最终得到平均数 5.0。
示例 2:沿轴计算平均值
import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(np.mean(arr, axis=0)) # 列平均
print(np.mean(arr, axis=1)) # 行平均运行结果如下。
[2. 3.]
[1.5 3.5]分析:
np.mean(arr, axis=0) 表示计算每列的平均值:第一列 ( 1 + 3 ) / 2 = 2,第二列 ( 2 + 4 ) / 2 = 3。
np.mean(arr, axis=1) 表示计算每行的平均值:第一行 ( 1 + 2 ) / 2 = 1.5,第二行 ( 3 + 4 ) / 2 = 3.5。
示例 3:保持维度(keepdims = True)
import numpy as np
arr = np.array([[1, 2], [3, 4]])
result = np.mean(arr, axis=1, keepdims=True)
print(result)运行结果如下。
[[1.5]
[3.5]]分析:
在上面的示例中,当 axis 设置为 1 时,计算了每一行的平均值:
- 第一行:(1 + 2) / 2 = 1.5。
- 第二行:(3 + 4) / 2 = 3.5。
由于 keepdims 设置为 True,结果保持了原始数组的维度,因此输出是一个形状为 (2, 1) 的二维数组。
示例 4:条件筛选(where 参数)
import numpy as np
arr = np.array([-1, 3, -5, 7])
result = np.mean(arr, where=(arr > 0))
print(result)运行结果如下。
5.0分析:
np.mean(arr, where=(arr > 0)) 中的 where=(arr > 0) 表示只计算正数的平均值,也就是:(3 + 7) / 2 = 5.0。需要注意的是,如果筛选后无元素,则结果将为 nan。
实际上,这个例子使用了 “NumPy 布尔索引” 的语法来实现条件筛选。
示例 5:指定数据类型(dtype 参数)
import numpy as np
arr = np.array([10, 20, 30])
result = np.mean(arr, dtype=np.float32)
print(result)运行结果如下。
20.0分析:
np.mean(arr, dtype=np.float32) 中的 dtype=np.float32 表示将结果强制输出位单精度浮点数,最终 20.0 的类型为 float32。
