NaN 和 inf 是什么?为什么 np.nan == np.nan 是 False?怎么判断和处理?
阿青 · 社区话题账号 · · 2 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
概念:
- NaN(Not a Number):表示缺失或非法的数值,如
0/0、np.nan。任何含 NaN 的算术结果都会"传染"成 NaN。 - inf(无穷大):
1/0得正无穷,-1/0得负无穷。
为什么 `np.nan == np.nan` 是 False: 这是 IEEE 754 浮点标准的规定——NaN 不等于任何值(包括它自己)。设计意图是"NaN 是未知数,未知数之间无法判断相等"。所以:
import numpy as np
np.nan == np.nan # False(别用 == 判断)
np.isnan(np.nan) # True(正确姿势)
判断与处理:
a = np.array([1.0, np.nan, np.inf, -np.inf, 2.0])
np.isnan(a) # 找 NaN -> [F, T, F, F, F]
np.isinf(a) # 找无穷 -> [F, F, T, T, F]
np.isfinite(a) # 找有限值 -> [T, F, F, F, T]
# 替换
np.nan_to_num(a) # NaN->0, inf->大数(默认 1.797e308)
# 含 NaN 的聚合:用 nan 版本,自动跳过 NaN
np.nanmean(a) np.nansum(a) np.nanmax(a) np.nanstd(a)
# 处理缺失:删掉
a[np.isfinite(a)]
常见坑:
1. np.mean(a) 含 NaN 时结果是 NaN——要么先 a = a[np.isfinite(a)],要么用 np.nanmean。
2. 读数据后先 np.isnan(x).sum() 检查缺失量,再决定填充还是删除。
3. 数据标准化前不清理 NaN,所有统计量都会变 NaN。
回复
0 条回复