np.percentile是计算百分位数的首选函数,支持单值/多值批量计算、轴向操作、keepdims保持维度及nan安全版本,新版用method参数控制插值。

用 np.percentile 计算单个百分位数最直接
多数时候你只是想快速拿到第25、50(中位数)、90等分位点,np.percentile 是首选。它默认对整个数组展平后计算,不改变原数组形状。
常见错误是传入 axis 但没注意返回结果的维度变化——比如对二维数组按行(axis=1)求第95百分位,返回的是长度为 arr.shape[0] 的一维数组,不是广播友好的形状。
- 基本用法:
np.percentile(arr, 95)→ 返回标量(若arr是 1D)或降维后数组 - 指定轴:
np.percentile(arr, 50, axis=0)→ 每列的中位数,结果 shape =(arr.shape[1],) -
keepdims=True能保留原始维度,避免后续广播出错,例如:np.percentile(arr, 90, axis=1, keepdims=True)返回 shape =(N, 1) - 插值方式默认是
linear,遇到非整数位置时会线性插值;若要严格取已有元素,用interpolation='lower'或'higher'(注意 NumPy 1.22+ 已改名为method参数,旧版用interpolation)
批量计算多个百分位数别用循环,传列表进 q 参数
想同时获取 [10, 25, 50, 75, 90] 这些常用分位点?别写 for 循环调用 np.percentile —— 它支持把百分位数组织成 list 或 array 直接传给 q 参数,内部一次排序 + 插值,比多次调用快得多,尤其对大数组。
注意返回结果的 shape:若输入 arr 是 (1000, 4),q=[10, 50, 90],则输出 shape 是 (3, 4)(axis=None 时)或 (3, 1000)(axis=1 时),顺序严格对应 q 中的顺序。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 正确写法:
np.percentile(arr, q=[10, 50, 90]) - 错误习惯:
[np.percentile(arr, q) for q in [10,50,90]]—— 多次排序,性能差且结果不易堆叠 - 如果需要和原数组做广播运算(如标准化),建议加
keepdims=True并手动调整axis,例如:np.percentile(arr, q=[10,90], axis=0, keepdims=True)→ shape (1, 4),可直接用于减法
np.quantile 和 np.percentile 本质一样,但接口更“统计直觉”
两者底层共享同一套实现,区别只在参数单位:np.percentile 的 q 是 0–100 的百分数,np.quantile 的 q 是 0–1 的分位数(即 quantile(q) == percentile(q * 100))。选哪个纯看团队习惯或代码上下文是否已混用。
容易被忽略的一点:当输入含 nan 时,二者默认都返回 nan,必须显式用 np.nanpercentile 或 np.nanquantile 才能跳过缺失值。这不是“自动处理”,而是明确的设计选择。
- 等价关系:
np.quantile(arr, 0.95)≡np.percentile(arr, 95) - 含 NaN 场景必须换函数:
np.nanpercentile(arr, 95),否则结果不可靠 - 新版 NumPy(≥1.22)中
method参数统一控制插值逻辑,如method='midpoint'、'nearest',旧版的interpolation已弃用
超大数组慎用默认算法,考虑内存与精度权衡
np.percentile 默认先 np.sort 整个数组,时间复杂度 O(n log n),内存占用 O(n)。当数组远超内存(比如 10GB 的 float64),直接调用会触发 MemoryError 或严重拖慢。
这时不能硬扛,得换思路:要么用近似算法(如 t-digest、DynaML 库),要么分块估算(但需注意分块后合并分位数本身不准确,除非用 P² 算法等流式方法)。
- 小到中等规模(np.percentile,它是经过高度优化的 C 实现
- 明确知道数据分布较均匀?可用
np.partition+ 手动插值,仅 O(n) 时间,但只适用于单一分位点且不要求高精度插值 - 生产环境处理日志级数据流?别依赖 NumPy 单次加载,应接入专用流式分位数库,NumPy 不是为此设计的
真正卡住人的往往不是语法,而是忘了“百分位数本质是排序后的切片位置”——一旦数据无法全量排序,所有基于 NumPy 的方案都会失效。

















