np.nan == np.nan问题

简介: 今天在学习动手学数据分析的课程的时候,细心的队友发现了一个问题。对于数值型数据,pandas使用浮点值NAN(Not a Number)来表示缺失值,我们称NaN为容易检测到的标识值但是在运行以下代码时候,会发现...

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

目录
相关文章
|
2月前
|
索引 Python
Numpy学习笔记(三):np.where和np.logical_and/or/not详解
NumPy库中`np.where`和逻辑运算函数`np.logical_and`、`np.logical_or`、`np.logical_not`的使用方法和示例。
190 1
Numpy学习笔记(三):np.where和np.logical_and/or/not详解
|
7月前
|
存储 数据挖掘 数据格式
np.fromfile
np.fromfile“【5月更文挑战第22天】”
605 3
|
2月前
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
54 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
2月前
|
机器学习/深度学习 索引 Python
Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码
本文解释了NumPy中`argmax`函数的`axis`参数在不同维度数组中的应用,并通过代码示例展示了如何使用`axis=0`、`axis=1`和`axis=-1`来找到数组中最大值的索引。
175 0
Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码
|
7月前
|
计算机视觉 Python
np.ones
np.ones
162 1
成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
|
7月前
np.where()使用详解
1.函数介绍 np.where函数相当于三元表达式的向量版本,能够针对向量作三元操作,有两种使用方法。 np.where(condition, x, y):当满足第一个参数条件时,where返回x,不满足第一个参数的条件时返回y。
198 0
|
Python
【Numpy】深入剖析Numpy.arange()与range()的区别
【Numpy】深入剖析Numpy.arange()与range()的区别
169 0
|
Python
深入理解Numpy中sum求和的axis参数
深入理解Numpy中sum求和的axis参数
164 0
|
算法 定位技术
浅谈P、NP、NP-Complate和NP-Hard问题
时间复杂度 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当程序所处理的问题规模扩大后,程序需要的时间长度对应增长得有多快。 也就是说,对于某一个程序,其处理某一个特定数据的效率不能衡量该程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。 不管数据有多大,程序处理所花的时间始终是那么多的,我们就说这个程序很好,具O(1)O(1)O(1)的时间复杂度,也称常数级复杂度;