【发布时间】:2019-02-06 23:37:37
【问题描述】:
这让我很困惑:
```
a=np.array([1,2,np.nan,3]) # an array with a nan
print(np.isnan(a)[2]) # it truly is a nan
print(a[2]) # it quacks like a nan
print(np.nan is np.nan) # nan's can be compared
print(a[2] is np.nan) # But then, this isn't a nan after all!!??
>>> True
>>> nan
>>> True
>>> False
```
我知道我们不允许将 nan 与 == 进行比较,但应该允许与 is 进行比较?毕竟在将 nan 与自身进行比较时它有效吗?
感谢您对这里发生的事情的任何提示。
【问题讨论】:
-
我也不完全理解,但这个观察可能会有所帮助:Python
floats 实际上也可以是nan。您可以通过float("nan")构建一个。但它似乎创造了一个新的对象。float("nan") is float("nan")返回False。 -
一般来说
is和==是完全不相关的操作。 Nan不是单身人士 -
is应该不被允许。它只允许用于明确定义为单例的事物(如None),或者用于您手动创建的您自己的类型的实例,以便您知道它们是否相同。这里没有一个是真的。对于两个单独的 NaN 值,x is y为真或为假是完全有效的;您的代码不能依赖任何一个。对于不同的情况(取决于您的 numpy 和 Python 版本)了解为什么它是正确的和不是正确的可能是有趣,但除了了解 Python 之外它没有有用内部更好。