np.nan == np.nan问题

在学习数据分析过程中,发现np.nan与自身比较返回False的现象,这源于浮点数NaN(Not A Number)的特殊性质。根据IEEE754标准,NaN与任何数的不等比较都返回True,包括np.nan!=np.nan。因此,不应使用np.nan进行比较操作,而应借助np.isnan()来检查是否为NaN。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

np.nan == np.nan问题

今天在学习动手学数据分析的课程的时候,细心的队友发现了一个问题。

对于数值型数据,pandas使用浮点值NAN(Not a Number)来表示缺失值,我们称NaN为容易检测到的标识值

但是在运行以下代码时候,会发现:

np.nan == np.nan

返回的却是:

False

有点百思不得其解。然后继续查阅官方代码仓库的issue,定位到:

BUG: Incorrect handling of not-equal comparison to nan · Issue #21685 · numpy/numpy (github.com)

涉及的链接还有:

floating point - What is the rationale for all comparisons returning false for IEEE754 NaN values? - Stack Overflow

simd - How to choose AVX compare predicate variants - Stack Overflow

得知:

np.nan和任何数做不等于比较都返回True

np.nan != np.nan
np.nan != 0
np.nan != None
np.nan != 0.0
True
True
True
True

原因是这个底层代码使用了有序比较或者无序比较:

使用有序比较时:

For _CMP_NEQ_OQ (Ordered comparisons returns false for NaN operands):

  • nan != nan --> false
  • nan != 0 --> false

使用无序比较时:

For _CMP_NEQ_UQ (Unordered comparison returns true for NaN operands):

  • nan != nan --> true
  • nan != 0 --> true

总之,别用np.nan做任何比较,大于,小于,等于都不行。

判断是否是NaN,可以参考使用:

np.isnan(np.nan)

np.isnanAPI文档:

numpy.isnan — NumPy v1.22 Manual

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈沧夜

打个赏,让我买瓶可乐喝呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值