numpy.isnan()是唯一靠谱的NaN检测方式,它基于IEEE 754标准底层调用C级isnan()函数,正确识别float32/float64/complex中的NaN,而==和is均失效。

numpy.isnan() 是唯一靠谱的 NaN 检测方式
用 == 或 is 判断 NaN 会永远返回 False,因为 IEEE 754 规定 NaN ≠ NaN。只有 numpy.isnan() 能正确识别浮点型 NaN 值,它底层调用的是 C 级别的 isnan() 函数,对 np.float32、np.float64 和 np.complex 类型安全有效。
常见错误现象:a[ a == np.nan ] 返回空数组;a is np.nan 报 ValueError: The truth value of an array with more than one element is ambiguous。
-
numpy.isnan()返回布尔数组,天然适配 NumPy 掩码索引 - 对非数值类型(如
objectdtype)会抛TypeError,不是所有数组都能直接用 - 如果数组含字符串或混合类型,得先用
pd.isna()(Pandas)或手动过滤 dtype
掩码索引时必须注意 dtype 和形状对齐
用 numpy.isnan() 得到布尔掩码后,直接用于索引是最快路径,但容易因维度不匹配报错。尤其在多维数组中,np.isnan(a) 返回和 a 同 shape 的布尔数组,但若后续做 a[mask],结果是一维展平数组 —— 这常被误以为“丢数据”。
使用场景:清洗传感器数据、替换缺失值、统计有效样本数。
立即学习“Python免费学习笔记(深入)”;
- 二维数组想按行保留全非 NaN 的行?用
a[np.all(np.isnan(a), axis=1) == False],别漏axis=1 - 想原地把 NaN 替成 0?写
a[np.isnan(a)] = 0,不是a = np.where(np.isnan(a), 0, a)(后者新建数组,更慢) - 如果
a.dtype是object,np.isnan(a)会炸,得先转成数值型或用np.vectorize(lambda x: isinstance(x, float) and np.isnan(x))
nan 与 None、pd.NA、inf 的行为差异
numpy.isnan() 只认 IEEE NaN,对 Python None、Pandas 的 pd.NA、NumPy 的 np.inf 全部返回 False。这不是 bug,是设计使然 —— 它只负责浮点异常值检测。
性能影响:在纯数值数组上,np.isnan() 比 pd.isna() 快 3–5 倍,因为无 Pandas 元数据开销;但若数组本身来自 DataFrame,直接用 df.isna() 更省心。
-
np.isnan(np.inf)→False;np.isnan(None)→TypeError - 混合了
np.nan和None的object数组?pd.isna()是唯一通用解法 - 需要同时检测 NaN 和 inf?用
np.isfinite()取反,即~np.isfinite(a)
dtype 为整数时 isnan 会静默失败
整数数组(int32、int64)根本存不了 NaN —— NumPy 会自动转成 float64 才允许插入 NaN。所以如果你看到一个 “整数数组里有 NaN”,那它实际 dtype 已是 float64,只是显示时用了整数格式(比如 array([1., nan, 3.]))。
容易踩的坑:用 a.astype(int) 强转含 NaN 的数组,会变成 -2147483648(溢出值),而不是报错。
- 检查前先看
a.dtype,别凭打印结果判断类型 - 想安全转回整数?先用
a[~np.isnan(a)].astype(int)过滤 NaN 再转 - 创建新数组时明确指定
dtype=float,避免隐式转换带来 dtype 不一致问题


















