布尔索引赋值最灵活可控;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 实现,大批量时略快于布尔索引,但差异通常可忽略
布尔索引赋值才是主力方案
明确、透明、不副作用,且支持任意填充逻辑(不止标量,还能用数组、函数结果等)。
实操要点:
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 先用
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 是浮点缺失的协议,不是万能空值占位符。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










