np.percentile(arr, 50) 是计算中位数最稳妥统一的方法,支持 axis、keepdims 等参数,需注意 q 必须为数字、默认插值为 'linear'、含 nan 时应改用 np.nanpercentile。

用 np.percentile 计算任意百分位数,别硬套公式
NumPy 不提供单独的「中位数函数」来替代 np.percentile,因为中位数本质就是第 50 百分位数。直接调 np.percentile(arr, 50) 最稳妥,比用 np.median 更统一——尤其当你需要同时算 25、50、75 百分位时,参数一致、行为一致。
常见错误是传入字符串或列表形式的 q 值(如 q=['25', '50']),np.percentile 要求 q 是数字或数字数组:np.percentile(arr, [25, 50, 75]) 才合法。另外,默认插值方式是 'linear',若数据含重复值或样本量小,结果可能和 Excel 或 SciPy 的 'midpoint' 不同,需显式指定 interpolation='midpoint' 对齐。
-
np.percentile(arr, 50)和np.median(arr)数值等价,但前者支持 axis、keepdims 等参数,更灵活 - 多维数组时,务必明确
axis:比如按列算(每列一个中位数)用axis=0,按行算用axis=1 - 遇到
nan会返回nan,需先用np.nanpercentile或清理数据
中位数不是「排序后取中间」那么简单
对偶数长度数组,NumPy 默认线性插值(如 [1,3] 返回 2.0),而不是简单取索引 n//2 - 1 和 n//2 两数平均——这二者在整数数组上结果相同,但浮点精度或非均匀分布下可能有微小差异。
真正容易踩坑的是 axis 行为:如果数组是二维且你没指定 axis,np.median 会把整个数组展平再算一个标量;而多数场景你需要每列/每行各自的中位数,必须写 np.median(arr, axis=0) 或 np.median(arr, axis=1)。
立即学习“Python免费学习笔记(深入)”;
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 不设
axis→ 返回单个标量(全数组汇总) -
axis=0→ 沿行方向压缩,结果形状为(n_cols,) -
axis=1→ 沿列方向压缩,结果形状为(n_rows,) - 想保留维度用
keepdims=True,避免广播出错
np.quantile 和 np.percentile 到底选哪个?
二者功能完全重叠:np.quantile(arr, q) 中 q 是 0–1 区间的小数(如 0.5 表示中位数),np.percentile(arr, q) 中 q 是 0–100 的百分数(如 50)。选哪个纯看上下文习惯——处理统计报告常用百分位(50th percentile),写机器学习 pipeline 里常混用分位数(0.75 quantile)。
注意:两者默认插值方式都是 'linear',但 SciPy 的 scipy.stats.mstats.mquantiles 默认用 'inverted_cdf',数值可能不同。如果你从 R 或 pandas 迁移代码,pandas 的 Series.quantile() 默认 interpolation='linear',和 NumPy 一致;但旧版 pandas 曾用 'nearest',需检查版本。
- 已习惯百分制 → 用
np.percentile - 对接数学公式或概率论文献 → 用
np.quantile - 二者性能无差异,编译后底层调同一段 C 代码
多维数组 + 缺失值 = 必须用 np.nanpercentile
只要数组里有一个 np.nan,np.percentile 就返回 nan,连警告都不给。这不是 bug,是设计:它不做隐式过滤,避免掩盖数据质量问题。真实业务中,传感器断连、日志缺失很常见,得主动用 np.nanpercentile。
但注意:np.nanpercentile 会自动丢弃 nan 后计算,不修改原数组。如果你需要保留原始 shape(比如做 mask 对齐),就得先用 np.isnan() 构造布尔掩码,再用 np.ma.masked_array 或布尔索引手动过滤——后者更直观:arr_clean = arr[~np.isnan(arr)]。
-
np.nanpercentile(arr, 50, axis=0)对每列分别忽略 nan 再算中位数 - 不能链式调用:
np.percentile(arr, 50).dropna()是错的,NumPy 没dropna方法 - 若全列为 nan,
np.nanpercentile仍返回 nan,需额外判断np.all(np.isnan(arr), axis=0)
实际用的时候,最常被忽略的是 axis 和插值方式的组合影响——尤其是做跨列归一化或分组统计时,差一个 axis 参数,结果维度就全乱了。

















