Python和Numpy的nan和set

时间:2015-04-09 17:00:55

标签: python numpy set nan

我遇到了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。浮动(' nan')也是如此!请注意:

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

我想知道这种差异是如何形成的,以及不同行为背后的理性是什么。

1 个答案:

答案 0 :(得分:6)

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

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