numpy中nan填充必须用np.isnan()判断,因nan!=nan导致arr[arr==np.nan]=0无效;np.isnan()返回布尔数组,支持arr[np.isnan(arr)]=0或均值填充;注意dtype需为float/object,inf不受影响;np.where()需用np.isnan(arr)而非arr==np.nan;np.nan_to_num()可统一处理nan/inf;混合类型需转pandas处理。

NumPy 中的 NaN 填充不能靠简单赋值解决,因为 NaN != NaN,直接用 arr[arr == np.nan] = 0 会失效——这行代码永远不生效。
用 np.isnan() 判断并索引替换
这是最可靠、最常用的方式。np.isnan() 是唯一能正确识别 NaN 的布尔函数,返回与原数组同形的 True/False 数组。
-
arr[np.isnan(arr)] = 0:将所有NaN替换为0 -
arr[np.isnan(arr)] = np.nanmean(arr):用均值填充(需先排除NaN) - 注意:
np.isnan()对非浮点类型(如int)数组会报错,必须确保 dtype 是float或object - 如果数组含
inf或-inf,np.isnan()不会影响它们,只管NaN
避免用 np.where() 做条件替换时的常见陷阱
np.where() 看似灵活,但容易写错判断逻辑,尤其在嵌套或广播场景下。
- 错误写法:
np.where(arr == np.nan, 0, arr)—— 因为NaN == NaN永远是False,结果全保留原值 - 正确写法:
np.where(np.isnan(arr), 0, arr) - 多条件组合时(如同时处理
NaN和inf):np.where(np.isnan(arr) | np.isinf(arr), 0, arr) - 注意
|是位运算符,不是or;用np.logical_or()也可,但更冗长
使用 np.nan_to_num() 快速统一处理异常浮点值
这个函数不只是填 NaN,它还一并处理 inf 和 -inf,适合预处理阶段快速“消毒”。
-
np.nan_to_num(arr, nan=0.0, posinf=1e10, neginf=-1e10):指定各异常值的替换值 - 默认行为是把
NaN→0、+inf→np.finfo(float).max、-inf→np.finfo(float).min - 不修改原数组,返回新数组;加
copy=False可尝试就地操作(但仅当内存连续且 dtype 兼容时生效) - 对
object类型数组无效,只支持数值型 dtype
真正麻烦的是混合类型数组(比如列中混了字符串和数字),np.isnan() 会直接报错;这时候得先用 pandas 转成 Series 再用 fillna(),或者手动过滤出数值列——NumPy 本身不负责类型推断和容错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











