NumPy 求分位数

分位数,又叫做 “分位点” ,它是使用概率来将一组数据分为几个等份。常用的分位数有:二分位数、四分位数、百分位数。其中二分位数也叫做 “中位数” 。

对于分位数来说,它具有以下性质:

  • 分位数会将数据分为若干等份。
  • 分位数不受极端值的影响。
  • 常用的分位数有中位数(50% 分位数)、四分位数(25% 和 75% 分位数)等。

分位数是数据分析中常用的一个统计量,比如老师经常会这样说: “这么简单的考试,竟然有 20% 的同学不及格!” 这句话就体现了分位数的应用。

在 NumPy 中,用于计算分位数的函数有 2 种:

  • percentile():计算数组的百分位数(0~100)。
  • quantile():计算数组的分位数(0~1)。

percentile() 和 quantile() 这 2 个函数底层实现是一样的,区别在于参数 q 的尺度不同。它们之间满足下面关系:

quantile(q) ≡ percentile(q*100)

numpy.percentile() 求百分位数

在 NumPy 中,我们可以使用 percentile() 函数来计算数组的 “百分位数” 。

语法:

numpy.percentile(
    arr,
    q,
    axis=None,
    out=None,
    overwrite_input=False,
    method='linear',
    keepdims=False
)

说明:

percentile() 函数可以接收以下参数。

  • arr(必选):是一个数组。
  • q(必选):要计算的百分位数或百分位数序列,取值范围为 [0, 100]。比如要计算中位数(50%),可以将 q 设置为 50。要计算多个百分位数,例如 25% 和 75%,可以将 q 设置为 [25, 75]。
  • axis(可选,默认:None):表示沿着哪个轴计算百分位数。
    • 如果为整数,则表示沿指定的轴进行计算。比如对于一个二维数组来说,其中,axis=0 表示计算每一列的百分位数(沿行方向)。axis=1 表示计算每一行的百分位数(沿列方向)。
    • 默认值为 None,表示将数组展平后,再计算整个数组的百分位数。
  • out(可选,默认:None):指定一个已有数组来存放结果,避免额外创建新数组,从而提高性能。
  • overwrite_input(可选,默认:False):如果设置为 True,则允许函数临时对输入数组进行排序以计算百分位数,这可以节省内存。请注意,这会修改原始的输入数组。只有在不需要保留原始数组时才使用。
  • method(可选,默认:'linear'):用于指定计算百分位数时使用的插值方法。可用的方法包括:
    • 'linear':线性插值(默认)。
    • 'lower':返回小于或等于分位点的最近值。
    • 'higher':返回大于或等于百分位数的最近值。
    • 'midpoint':返回两个最近数据点的平均值。
    • 'nearest':返回最近的一个数据点。
  • keepdims(可选,默认:False):表示是否在结果中保留原始数组的维度。
    • 当取值为 True 时,表示保留维度,结果的形状中,计算的轴会变成大小为 1。
    • 当取值为 False 时,结果会降维。

示例 1:percentile() 基本用法

import numpy as np

arr = np.array([3, 1, 4, 2, 5])
result1 = np.percentile(arr, 50)    # 计算 50% 分位数(中位数)
result2 = np.percentile(arr, 25)    # 计算 25% 分位数

print('50% 分位数:', result1)
print('25% 分位数:', result2)

运行结果如下。

50% 分位数:3.0
25% 分位数:2.0

分析:

numpy.percentile(arr, 50) 计算了数组 arr 的 50% 分位数(中位数),numpy.percentile(arr, 25) 计算了数组 arr 的 25% 分位数。

numpy.quantile() 求分位数

在 NumPy 中,我们还可以使用 quantile() 函数来计算数组的 “分位数” 。

语法:

numpy.quantile(
    arr,
    q,
    axis=None,
    out=None,
    overwrite_input=False,
    method='linear',
    keepdims=False
)

说明:

numpy.quantile() 函数接收以下参数。

  • arr(必选):需要计算分位数的数组。
  • q(必选):要计算的分位数或分位数序列,取值范围为 [0, 1]。例如,要计算中位数(对应于 50% 的分位数),可以将 q 设置为 0.5。
  • axis(可选,默认:None):指定沿着哪个轴计算分位数。
    • 如果为整数,则表示沿指定的轴进行计算。比如对于一个二维数组来说,axis = 0:计算每一列的分位数(沿行方向)。axis = 1:计算每一行的分位数(沿列方向)。
    • 默认值为 None,表示将数组展平后计算整个数组的分位数。
  • out(可选,默认:None):指定一个已有数组来存放结果,避免额外创建新数组,从而提高性能。
  • overwrite_input(可选,默认:False):如果设置为 True,则允许函数临时对输入数组进行排序以计算分位数,这可以节省内存。请注意,这会修改原始的输入数组。只有在不需要保留原始数组时才使用。
  • method(可选,默认:'linear'):用于指定计算分位数时使用的插值方法。可用的方法包括:
    • 'linear':线性插值(默认)。
    • 'lower':返回小于或等于分位点的最近值。
    • 'higher':返回大于或等于百分位数的最近值。
    • 'midpoint':返回两个最近数据点的平均值。
    • 'nearest':返回最近的一个数据点。
  • keepdims(可选,默认:False):表示是否在结果中保留原始数组的维度。
    • 当取值为 True 时,表示保留维度,结果的形状中,计算的轴会变成大小为 1。
    • 当取值为 False 时,结果会降维。

示例 2:quantile() 基本用法

import numpy as np

arr = np.array([3, 1, 4, 2, 5])
result1 = np.quantile (arr, 0.5)    # 计算 50% 分位数(中位数)
result2 = np.quantile(arr, 0.25)    # 计算 25% 分位数

print('50% 分位数:', result1)
print('25% 分位数:', result2)

运行结果如下。

50% 分位数:3.0
25% 分位数:2.0

分析:

numpy.quantile(arr, 0.5) 计算了数组 arr 的 0.5 分位数(中位数),numpy.quantile(arr, 0.25) 计算了数组 arr 的 0.25 分位数。

示例 3:多维计算

import numpy as np

arr = np.array([[1, 3, 5], [2, 4, 6]])

# 计算每列的中位数(axis=0)
result1 = np.quantile(arr, 0.5, axis=0)
print(result1)

# 保留维度计算行 75% 分位数
result2 = np.quantile(arr, 0.75, axis=1, keepdims=True)
print(result2)

运行结果如下。

[1.5 3.5 5.5]
[[4.]
 [5.]]

分析:

对于 np.quantile(arr, 0.5, axis=0) 来说,axis=0 表示沿列方向计算,即对每一列单独计算 50% 分位数(即中位数):

  • 第一列 [1, 2] 的中位数为 (1 + 2) / 2 = 1.5。
  • 第二列 [3, 4] 的中位数为 (3 + 4) / 2 = 3.5。
  • 第三列 [5, 6] 的中位数为 (5 + 6) / 2 = 5.5。
  • ​结果:[1.5, 3.5, 5.5],表示每列的中位数。

对于 np.quantile(arr, 0.75, axis=1, keepdims=True) 来说,axis=1 表示沿行方向计算,即对每一行单独计算 75% 分位数。

  • 对于第一行 [1, 3, 5],75% 分位数是 4。
  • 对于第二行 [2, 4, 6],75% 分位数是 5。

keepdims=True 表示保留原始数组的维度,因此输出结果是一个形状为 (2, 1) 的二维数组。

常见问题

1. 为什么 [1, 3, 5] 的 75% 分位数是 4?

这是因为 75% 的位置正好落在数字 “3” 和数字 “5” 的正中间。由于我们默认使用了 method='linear'(线性插值),因此NumPy 会自动取 3 和 5 的中间值,即 3 + (5 - 3) * 0.5 = 4.0。

上一篇: NumPy 求标准差

下一篇: NumPy 广播机制

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号