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 的对象。
我 运行 使用 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 的对象。