优先用 np.quantile 因其参数 q 为 0.0–1.0 分位数,贴合统计直觉且与 sklearn/scipy 一致;需显式指定 method 控制插值,用 keepdims 避免维度压缩,含 nan 时须改用 np.nanquantile。

NumPy 的 np.quantile 是最直接、最可控的分位数计算方式;用 np.percentile 容易因参数单位混淆出错,尤其在与 pandas 或 SciPy 交互时。
为什么优先用 np.quantile 而不是 np.percentile
np.quantile 接收的是「分位数」(0.0 到 1.0),np.percentile 接收的是「百分位」(0 到 100)。两者功能几乎一样,但单位不一致极易导致误传参数——比如把 0.75 当成 75 传给 np.percentile,结果就错了。实际项目中,多数统计逻辑(如 IQR、异常值判定)天然以小数形式表达分位点,np.quantile 更贴合思维习惯。
- 统一用
np.quantile(arr, q=0.25)表达下四分位数,不用换算 -
np.percentile(arr, 25)看似直观,但和 sklearn、scipy 的q参数不一致,跨库迁移时容易漏改 - 两者默认插值方式相同(
linear),性能无差异
np.quantile 的插值行为必须显式控制
当目标分位点落在两个数据点之间时,NumPy 默认用线性插值。这在大多数场景合理,但若你依赖确定性结果(比如测试断言、金融风控阈值),插值方式就成了关键变量。
-
interpolation参数已弃用,应改用method(NumPy ≥ 1.22) - 常用选项:
method="linear"(默认)、"lower"(取左邻值)、"higher"(取右邻值)、"midpoint"(取中点) - 例如:
np.quantile([1, 2, 3, 4], 0.3, method="lower")返回2.0,而method="linear"返回2.2
多维数组分位数计算要小心 axis 和 keepdims
对二维数组求每列的中位数,写 np.quantile(arr, 0.5, axis=0) 没问题;但若后续要广播回原 shape 做减法,就容易维度不匹配。
- 默认情况下,
axis维度会被压缩掉,返回 shape 缩小 - 加
keepdims=True可保留维度,比如arr.shape == (100, 4)→np.quantile(..., axis=0, keepdims=True).shape == (1, 4) - 漏掉
keepdims是线上 bug 常见来源,尤其在特征中心化、Z-score 计算中
处理含 NaN 的数据:别依赖默认行为
np.quantile 默认不忽略 NaN,遇到任何 NaN 就直接返回 nan —— 这和 np.nanquantile 完全不同。
- 想跳过缺失值?必须用
np.nanquantile,它和np.quantile接口一致,只是自动过滤NaN -
np.quantile不提供nan_policy类参数,不存在“报错/忽略/传播”选择逻辑 - 混合使用时注意:如果上游数据可能含
NaN,却误用了np.quantile,下游所有统计值都会静默变成nan
真正麻烦的不是不会调用函数,而是插值方法、维度压缩、NaN 处理这三处默认行为,在不同业务场景下需要不同配置,且一旦写错很难被单元测试覆盖到。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











