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月前
|
存储 数据挖掘 数据格式
np.fromfile
np.fromfile“【5月更文挑战第22天】”
164 3
|
2月前
|
计算机视觉 Python
np.ones
np.ones
36 1
range() 函数
`range()`函数在Julia中生成指定范围和步长的序列。它可以有四个参数:`start`(起始值),`stop`(结束值),`length`(长度)和`step`(步长)。例如,`range(1, stop=100)`产生从1到100的序列。如果`length`未指定,序列会在接近`stop`但能被`step`整除的位置结束。`collect()`与`range()`结合使用可创建数组。示例展示了不同参数组合下的序列生成,并将其转换为数组。
|
2月前
np.where()使用详解
1.函数介绍 np.where函数相当于三元表达式的向量版本,能够针对向量作三元操作,有两种使用方法。 np.where(condition, x, y):当满足第一个参数条件时,where返回x,不满足第一个参数的条件时返回y。
90 0
成功解决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').
|
Python
深入理解Numpy中sum求和的axis参数
深入理解Numpy中sum求和的axis参数
100 0
|
Python
【Numpy】深入剖析Numpy.arange()与range()的区别
【Numpy】深入剖析Numpy.arange()与range()的区别
118 0
|
PyTorch 算法框架/工具 索引
如何将[array([5, 0, 0, 0, 0, 0], dtype=uint32), array([0, 1, 0, 4, 0, 0], dtype=uint32), array([0, 0, 0, 3, 3, 3], dtype=uint32)] 转换成一个torch张量
在这个代码中,我先使用 torch.randperm() 函数生成一个长度为原始张量大小的随机索引序列,并用这个索引序列对原始张量进行重排,得到了打乱后的张量 shuffled_tensor。然后,我使用 torch.split() 函数将 shuffled_tensor 拆分成 3 份子张量,并打印出来以验证是否拆分成功。
281 0
|
大数据 数据处理 开发者
缺失值处理_null&NaN_处理 | 学习笔记
快速学习缺失值处理_null&NaN_处理
84 0
缺失值处理_null&NaN_处理 | 学习笔记
|
Python
TypeError: img is not a numpy array, neither a scalar
TypeError: img is not a numpy array, neither a scalar
224 0