NumPy - 中位数
什么是中位数?
在数学中,中位数是指按顺序排列一组数字后,位于中间的值。
如果该集合包含奇数个值,则中位数是中间的一个。如果包含偶数个值,则中位数是两个中间值的平均值。
中位数对于查找数据的集中趋势很有用,尤其是在存在异常值的情况下。
NumPy median() 函数
NumPy 中的 median() 函数计算数组元素的中位数。它会对值进行排序并返回中间值;如果数组包含偶数个元素,则返回两个中间值的平均值。
您还可以指定一个轴来沿行或列计算中位数。例如,np.median([1, 3, 2, 4]) 返回 2.5。
以下是 NumPy 中 median() 函数的基本语法 -
numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)
其中:
- a: 计算中位数的输入数组或数据集。
- axis: 指定计算中位数的轴。如果为 None(默认值),则计算整个数组的中位数。
- out: 指定结果的存储位置。如果为 None(默认值),则结果将作为新数组返回。
- overwrite_input: 如果为 True,则输入数组将进行修改以节省内存。当您不需要原始数据时,此功能非常有用。
- keepdims: 如果为 True,则结果将保留缩小后的维度,以便于广播。如果为 False(默认值),则结果将被压缩。
理解中位数计算
数据集中中位数的计算遵循以下步骤 -
- 步骤 1: 按升序对数组进行排序。
- 步骤 2: 找到中间元素。如果元素数量为奇数,则中间元素为中位数。
- 步骤 3:如果元素数量为偶数,则计算中间两个元素的平均值,即为中位数。
示例
让我们通过一个例子来理解这个概念。这里,在第一个示例中,数组的元素数量为奇数(5),因此返回中间元素(5)作为中位数。
在第二个示例中,数组的元素数量为偶数(4),因此中位数是通过对中间两个元素(3 和 5)取平均值来计算的,结果为 4.0 -
import numpy as np data_odd = np.array([1, 3, 5, 7, 9]) data_even = np.array([1, 3, 5, 7]) # 计算两个数据集的中位数 median_odd = np.median(data_odd) median_even = np.median(data_even) print("奇数数据集的中位数:", median_odd) print("偶数数据集的中位数:", median_even)
以下是得到的输出 −
奇数数据集的中位数:5.0 偶数数据集的中位数:4.0
沿不同轴计算中位数
在 NumPy 中,axis 参数允许您沿多维数组的特定轴计算中位数。axis 指的是计算中位数的方向。例如,在二维数组中 -
- axis=0: 计算沿列(垂直轴)的中位数。
- axis=1: 计算沿行(水平轴)的中位数。
示例
在下面的示例中,我们将计算二维数组两个轴的中位数 -
import numpy as np # 创建二维数组 data_2d = np.array([[1, 3, 5], [2, 4, 6], [7, 8, 9]]) # 计算轴 0(列)的中位数 median_axis_0 = np.median(data_2d, axis=0) # 计算轴 1(行)的中位数 median_axis_1 = np.median(data_2d, axis=1) print("轴 0 的中位数:", median_axis_0) print("轴 1 的中位数:", median_axis_1)
在下面的输出中,轴 0 的中位数是通过取每列的中位数计算得出的。轴 1 上的中位数是通过取每行的中位数来计算的 -
轴 0 上的中位数:[2. 4. 6.] 轴 1 上的中位数:[3. 4. 8.]
高维数组的中位数
numpy.median() 函数也适用于二维以上的数组。您可以指定要计算中位数的轴,该函数将返回该轴的中位数,同时保留其他维度。如果未指定轴,则计算整个数组的中位数。
示例
以下是计算三维数组中位数的示例 -
import numpy as np # 创建三维数组 data_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 沿轴 0 的中位数 median_3d_axis_0 = np.median(data_3d, axis=0) # 沿轴 1 的中位数 median_3d_axis_1 = np.median(data_3d, axis=1) # 沿轴 2 的中位数 median_3d_axis_2 = np.median(data_3d, axis=2) print("沿轴 0 的中位数:", median_3d_axis_0) print("沿轴 1 的中位数:", median_3d_axis_1) print("沿轴 2 的中位数:", median_3d_axis_2)
在本例中,沿三维数组的每个轴(0、1 和 2)计算中位数。该函数返回每个指定轴的中值,同时保留其他维度 -
沿轴 0 的中位数:[[3. 4.] [5. 6.]] 沿轴 1 的中位数:[[2. 3.] [6. 7.]] 沿轴 2 的中位数:[[1.5 3.5] [5.5 7.5]]
处理 NaN(非数字)值
有时,数组可能包含 NaN(非数字)值,这会干扰中位数的计算。为了处理 NaN 值,NumPy 提供了一个选项,可以在中位数计算过程中忽略它们。您可以使用 numpy.nanmedian() 函数,该函数计算中位数时会忽略 NaN 值。
示例
以下是在 NumPy 中计算中位数时处理 NaN 值的示例 -
import numpy as np # 创建一个包含 NaN 值的数组 data_with_nan = np.array([1, 3, np.nan, 5, 7]) # 计算中位数时忽略 NaN 值 median_without_nan = np.nanmedian(data_with_nan) print("不包含 NaN 的中位数:", median_without_nan)
在此示例中,np.nanmedian() 函数会忽略 NaN 值并计算剩余数字的中位数,结果为 4.0。
不含 NaN 的中位数:4.0