【问题标题】:Why does assert np.nan == np.nan cause an error?为什么 assert np.nan == np.nan 会导致错误?
【发布时间】:2017-06-05 11:04:48
【问题描述】:

如果

assert 1 == 1

很好,为什么会这样:

assert np.nan == np.nan

导致断言错误?

更让人迷惑的是,这样也行:

assert np.nan != np.nan

测试nan 的最佳方法是什么?

【问题讨论】:

  • 因为NaN != NaN,它是浮点数规范的一部分。测试 identityis 运算符),而不是 equality

标签: python numpy


【解决方案1】:

NaN 具有不等于自身的属性,你应该使用np.isnan 来测试NaN 的值,这里np.isnan(np.nan) 将产生True

In[5]:
np.nan == np.nan

Out[5]: False

In[6]:
np.nan != np.nan

Out[6]: True

In[7]:
np.isnan(np.nan)

Out[7]: True

【讨论】:

  • is 不是一个好主意:a = np.float(1e150)/1e-250 b = np.float(-1e150)/1e-250 a+b is np.nan 产生 False。这是因为np.nan 是 NaN 的 example,而不是 the NaN。
【解决方案2】:

使用np.isnan(value)NaN 不与自身比较,因为它表示失败,并且可能不是以相同的方式产生的。我不确定为什么 CPython 文档中缺少 isnan,但它在 CPython 3.4 和 2.7 中都存在于 math 中,并且在 numpy 中作为 ufunc 存在。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2020-06-03
    • 2019-10-17
    • 2020-12-11
    • 2020-04-30
    • 2012-05-04
    相关资源
    最近更新 更多