推荐使用 np.quantile(q∈[0,1])替代 np.percentile(q∈[0,100]),需显式指定 axis 避免展平,含 nan 时改用 np.nanquantile,批量计算可用 out 复用内存。

用 np.quantile 直接算,别用 np.percentile
np.quantile 是 NumPy 1.15+ 推荐的接口,参数更统一、语义更清晰:它接受 0–1 区间的 q 值(比如 0.25 表示下四分位数),而 np.percentile 还要除以 100,容易手误。两者底层一致,但 np.quantile 在多维场景下行为更可预期。
常见错误是传入 q=25 还以为是在调 np.quantile——其实那会报错,因为 q 超出 [0, 1] 范围;而 np.percentile 却能接受 q=25,造成混淆。
- 正确写法:
np.quantile(arr, q=0.75, axis=0) - 错误写法:
np.quantile(arr, q=75)→ ValueError: q must be in [0, 1] - 兼容旧版本?用
np.percentile(arr, q=75, axis=0),但注意q单位是百分比
指定 axis 控制统计方向,避免意外展平
默认不设 axis 时,np.quantile 会先把整个数组拉成一维再计算,丢失结构信息。例如一个 shape 为 (100, 5) 的数据矩阵,你想按列算每个特征的中位数,就必须显式写 axis=0。
容易踩的坑是误用 axis=-1 或 axis=1 导致结果 shape 对不上预期。建议先看原数组维度,再对照 axis 含义确认:
-
axis=0:沿第 0 轴压缩 → 对每列独立计算 → 输出 shape 去掉第 0 维 -
axis=1:沿第 1 轴压缩 → 对每行独立计算 → 输出 shape 去掉第 1 维 -
axis=(0, 2):支持 tuple,同时在多个轴上压缩(需 NumPy ≥ 1.20)
示例:
arr = np.random.randn(4, 3, 2)<br>q75 = np.quantile(arr, q=0.75, axis=(0, 2)) # shape (3,)
处理含 NaN 的数组:必须加 nanquantile
只要数组里有一个 np.nan,普通 np.quantile 就会返回 nan,哪怕其他值全有效。这不是 bug,是设计行为——它不做隐式过滤。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
想跳过 NaN 统计?唯一可靠方式是换用 np.nanquantile,它的接口和 np.quantile 完全一致,只是自动忽略 NaN:
-
np.quantile([1, 2, np.nan, 4], q=0.5)→nan -
np.nanquantile([1, 2, np.nan, 4], q=0.5)→2.0 - 多维同理:
np.nanquantile(arr, q=0.9, axis=1)
注意:np.nanquantile 不支持 keepdims=True 以外的某些高级选项(如插值方法在极老版本中受限),但日常够用。
性能关键:提前用 out 参数复用内存
批量计算多个分位数(比如 q=[0.25, 0.5, 0.75])时,NumPy 默认为每次调用分配新数组。如果数组很大、q 很多,内存和时间开销明显。
解决办法是预分配输出数组,用 out 参数写入:
- 先构造形状匹配的
out数组:out = np.empty((3,) + arr.shape[1:], dtype=arr.dtype) - 再传入:
np.quantile(arr, q=[0.25, 0.5, 0.75], axis=0, out=out) - 这样避免重复 alloc/free,尤其在循环中反复调用时效果显著
注意:out 的 shape 必须与结果完全一致(包括维度顺序),否则报 ValueError: output array is not acceptable。
多维分位数真正的复杂点不在函数调用本身,而在 axis 语义理解、NaN 处理策略选择,以及批量场景下的内存控制——这三个地方没对齐,结果就容易“看着像对的,其实错了”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










