我遇到了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
我想知道这种差异是如何形成的,以及不同行为背后的理性是什么。
答案 0 :(得分:6)
NAN的一个属性是NAN!= NAN,与所有其他数字不同。但是,set
的实现首先检查id(x)是否与哈希索引处的现有成员匹配,然后才尝试插入新的成员。如果你有两个具有不同id的对象,它们都具有值NAN,那么你将在集合中获得两个条目。如果它们都具有相同的ID,则它们会合并为一个条目。
正如其他人所指出的,np.nan
是一个始终具有相同ID的单个对象。