Python和Numpy的nan和set

Fin*_*sen 6 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])
Run Code Online (Sandbox Code Playgroud)

这里np.nan产生一个单独的元素集,而Numpy的nans产生一组中的多个nans.浮动('nan')也是如此!请注意:

>>> type(float('nan')) == type(np.nan)
True
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*som 7

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

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

  • 关于“总是有相同的 id”,有些事情很奇怪: if `l = np.array([np.nan, np.nan])`, then `id(l[0]), id(l[1 ]),[l] 中 x 的 id(x) 为“(946651263888, 946651263888, [946651263888, 946651263912])”。 (2认同)