NumPy中需用np.isinf()检测±inf、np.isnan()检测NaN,二者互不覆盖;统一检测用np.isinf(x)|np.isnan(x),判断存在性用.any(),整数数组需先转浮点型。

用 np.isinf() 和 np.isnan() 分别捕获无穷与 NaN
NumPy 不提供“一键检测所有异常值”的函数,必须分开处理:无穷大(+inf、-inf)由 np.isinf() 检测,非数(NaN)由 np.isnan() 检测。这两个函数返回布尔数组,形状与输入一致,元素为 True 表示对应位置是目标异常值。
常见错误是误以为 np.isinf(x) 能同时识别 NaN——它不会,NaN 在 np.isinf() 下恒为 False;同理,np.isnan() 对无穷大也返回 False。所以二者必须独立调用或显式组合。
-
np.isinf(x)对float('inf')、float('-inf')返回True,对np.nan返回False -
np.isnan(x)仅对np.nan(及等价浮点表示)返回True - 若需统一标记所有异常(
inf或nan),用np.isinf(x) | np.isnan(x),注意用位或|,不是逻辑 or
检查整个数组是否含异常值:用 .any() 别直接用 if arr:
想快速判断一个数组里“有没有”异常值,不要写 if np.isnan(arr):——这会触发 ValueError(无法将布尔数组转为标量条件)。正确做法是先生成布尔数组,再调用 .any() 方法:
import numpy as np arr = np.array([1.0, 2.0, np.nan, 4.0]) has_nan = np.isnan(arr).any() # True has_inf = np.isinf(arr).any() # False has_any_abnormal = (np.isinf(arr) | np.isnan(arr)).any() # True
注意:.any() 是最常用且安全的聚合方式;.sum() 也可用(因为布尔值可当 0/1 计算),但语义不如 .any() 清晰。避免使用 np.any(np.isnan(arr)) ——虽然结果相同,但多一层函数调用,无必要。
立即学习“Python免费学习笔记(深入)”;
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
替换或过滤异常值时,注意原地修改与副本的区别
用布尔索引做赋值(如把 NaN 换成 0)默认修改原数组;若不想改动原始数据,得先 .copy()。另外,np.nan 不能用 == 判断,所以 arr[arr == np.nan] = 0 完全无效——必须用 np.isnan() 生成掩码。
- 就地填充:
arr[np.isnan(arr)] = 0;arr[np.isinf(arr)] = np.nan(把 inf 改成 NaN 再统一处理) - 安全过滤(剔除异常值):
clean_arr = arr[~(np.isinf(arr) | np.isnan(arr))],其中~取反 - 若数组含整数类型(
int64等),np.nan和np.inf无法存入——此时np.isnan()或np.isinf()对该数组一律返回全False,不报错但结果无意义;务必先确认 dtype 是浮点型(如float32、float64)
读取外部数据后立即检查:Pandas 与 NumPy 的异常值表现不一致
从 CSV 或数据库加载数据进 Pandas DataFrame 后转成 NumPy 数组,容易忽略隐式类型转换带来的陷阱。例如,Pandas 把缺失值记作 pd.NA 或 None,但转成 np.array(df['col']) 时,若列是整数型,这些缺失值可能变成 np.nan(强制升为 float64),也可能被静默丢弃或引发警告。
更稳妥的做法是:先用 Pandas 自带方法检查(df['col'].isna().any()、df['col'].isin([np.inf, -np.inf]).any()),确认后再转 NumPy;或者转完立刻验证 dtype:arr.dtype == np.float64,否则 np.isnan() 就是摆设。
真正麻烦的是混合类型列(如字符串+数字),转成 object 类型 NumPy 数组后,np.isnan() 会报 TypeError;这种场景必须先清洗或分类型处理,不能依赖通用浮点检测函数。

















