布尔索引赋值最灵活可控;np.nan_to_num默认替换inf易污染数据,仅处理NaN需设posinf/neginf=None,且对整型数组会静默转浮点,而np.isnan仅对浮点有效,非NaN空值需用pd.isna等识别。

直接用布尔索引赋值最灵活、最可控;np.nan_to_num 适合快速替换但默认行为容易误伤。
为什么 np.nan_to_num 不总靠谱
它默认把 NaN 换成 0,inf 换成 np.finfo(float).max,-inf 换成 np.finfo(float).min——这在你只关心 NaN 时反而会污染数据。比如你有一列含 inf 的指标(如除零结果),用它一统替换就失真了。
常见错误现象:np.nan_to_num(arr, nan=0) 看似安全,但若没显式设 posinf 和 neginf 为 None,仍会悄悄改掉无穷值。
- 正确写法(仅动
NaN):np.nan_to_num(arr, nan=0, posinf=None, neginf=None) - 如果数组是整型,
np.nan_to_num会静默转成浮点——可能破坏 dtype 约束 - 性能上它底层是 C 实现,大批量时略快于布尔索引,但差异通常可忽略
布尔索引赋值才是主力方案
明确、透明、不副作用,且支持任意填充逻辑(不止标量,还能用数组、函数结果等)。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操要点:
- 先用
np.isnan(arr)生成布尔掩码,注意它对非浮点类型(如int、str)返回全False,别误以为没NaN - 确保目标数组是浮点型(如
arr = arr.astype(float)),否则赋值np.nan或浮点数会报错或截断 - 支持向量化填充:
arr[np.isnan(arr)] = 999,或更动态的arr[np.isnan(arr)] = np.mean(arr[~np.isnan(arr)]) - 二维数组同样适用:
mask = np.isnan(arr); arr[mask] = 0,自动展平匹配,无需np.where
填充前务必确认 NaN 真的存在
很多“空值”其实不是 np.nan:可能是字符串 'N/A'、空字符串 ''、None(在 object 数组里)、甚至 0 或 -999 这类哨兵值。直接上 np.isnan 会完全失效。
检查方法:
-
np.any(np.isnan(arr))—— 最快确认有无NaN -
pd.isna(arr)(需 pandas)能统一识别NaN/None/NaT,比纯 NumPy 更鲁棒 - 打印
arr.dtype:如果是object,np.isnan不工作,得用arr == None或pd.isna
真正麻烦的从来不是怎么填,而是填之前没搞清数据里到底有什么——NaN 是浮点缺失的协议,不是万能空值占位符。

















