最常用但需注意:zscore默认按列计算,一维数组须指定axis=0;其均值和标准差易受离群值污染,建议改用中位数与MAD构造稳健阈值;IQR法更鲁棒,应使用np.quantile(arr, [0.25, 0.75])计算Q1、Q3,并用nanpercentile处理含NaN数据。

用 np.abs(zscore) 做标准差掩码最常用但要注意中心化
直接用 scipy.stats.zscore 计算 z 值再设阈值(如 3)是最直观的离群值剔除方式,但容易忽略两点:一是 zscore 默认按列计算,一维数组要加 axis=0 防止维度错乱;二是它内部用均值和标准差中心化,而均值本身会被离群值污染——所以实际中建议先用中位数和 MAD(中位数绝对偏差)替代,或先粗筛再重算统计量。
实操建议:
- 对一维数据,务必传
axis=0,否则zscore(arr)可能返回标量或形状异常 - 若数据含明显偏态或重尾,改用
scipy.stats.median_abs_deviation+ 中位数构造稳健阈值 - zscore 掩码后用布尔索引取子集,别用
np.delete,后者需传入索引数组,效率低且易出错
布尔索引配合 np.quantile 做 IQR 掩码更鲁棒
IQR(四分位距)法不依赖正态假设,对非高斯分布更安全。核心是计算 Q1 = np.quantile(arr, 0.25) 和 Q3 = np.quantile(arr, 0.75),然后定义上下界:low_bound = Q1 - 1.5 * (Q3 - Q1),up_bound = Q3 + 1.5 * (Q3 - Q1)。注意 np.quantile 默认插值方式是 linear,小样本时可考虑 method='midpoint' 减少边界抖动。
常见错误现象:
- 直接写
arr[(arr > low_bound) & (arr 忘了括号,导致&运算符优先级高于比较,报ValueError: The truth value of an array with more than one element is ambiguous - 对空数组或全 NaN 数组调用
np.quantile会返回nan,后续边界计算失效;应提前用np.isfinite(arr).sum() > 0校验 - 多维数组未指定
axis,默认在展平后计算,结果不符合逐列/逐行剔除预期
用 np.where + np.nanpercentile 处理含 NaN 的真实数据
传感器或日志数据常含 nan,而 np.quantile 遇到 nan 直接返回 nan。此时必须换用 np.nanpercentile,它自动跳过 nan 计算分位数。但注意:它不支持 method 参数(仅 numpy>=1.22 版本起支持 interpolation,已弃用),老版本只能接受默认线性插值。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
使用场景:
- 原始数据含缺失值且不能简单删除整行(如时间序列需保持续性)
- 需保留原始数组 shape,只把离群位置置为
nan,后续用pd.Series.interpolate()或scipy.ndimage.uniform_filter1d平滑 - 想定位离群索引而非仅取子集,用
np.where((arr up_bound))返回元组,解包为outlier_idx = np.where(...)[0]
性能关键:避免重复计算统计量与掩码链式调用
在循环中反复对同一数组调用 np.quantile 或 zscore 是典型性能陷阱。NumPy 统计量函数本身不缓存,每次都是全量扫描。若需多次用相同阈值过滤不同字段(如 DataFrame 多列),应预先算好 Q1/Q3 或 mean/std,再广播到布尔表达式。
实操建议:
- 对二维数组做逐列 IQR,用
np.quantile(arr, [0.25, 0.75], axis=0)一次获取两组分位数,比两次调用快 40%+ - 掩码生成后立即用于索引,不要拆成
mask = ...和arr[mask]两步——除非需复用该 mask,否则中间变量无益于性能 - 超大数据(>1e7 元素)慎用
zscore,因它内部会显式构造均值广播数组,内存翻倍;改用原地减均值再除标准差更省空间
离群值剔除没有银弹:zscore 快但怕偏态,IQR 稳但对小样本分位数估计不准,真正复杂的数据往往得组合用——比如先 IQR 粗筛,再对剩余数据用 zscore 细筛。别忘了检查掩码后是否还剩足够样本量,尤其在分组操作中,空组会静默破坏下游逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










