Python 和 Numpy 的 nan 和 set

Python's and Numpy's nan and set

我 运行 使用 Python 的 Numpy、set 和 NaN(非数字)进行了意外行为:

>>> set([np.float64('nan'), np.float64('nan')])
set([nan, nan])
>>> set([np.float32('nan'), np.float32('nan')])
set([nan, nan])
>>> set([np.float('nan'), np.float('nan')])
set([nan, nan])
>>> set([np.nan, np.nan])
set([nan])
>>> set([float('nan'), float('nan')])
set([nan, nan])

此处 np.nan 产生单个元素集,而 Numpy 的 nans 在一个集合中产生多个 nans。 float('nan') 也是如此!并注意:

>>> type(float('nan')) == type(np.nan)
True

我想知道这种差异是如何产生的,不同行为背后的合理性是什么。

与所有其他数字不同,NAN 的一个属性是 NAN != NAN。但是,set 的实现首先检查 id(x) 是否与散列索引处的现有成员匹配,然后再尝试插入新成员。如果您有两个具有不同 ID 且都具有值 NAN 的对象,您将在集合中获得两个条目。如果它们都具有相同的 ID,它们将合并为一个条目。

正如其他人指出的那样,np.nan 是一个始终具有相同 ID 的对象。