【问题标题】:Cannot detect nan value in a list even though datatype is logically correct即使数据类型在逻辑上正确,也无法检测列表中的 nan 值
【发布时间】:2020-05-07 00:54:37
【问题描述】:

我在使用 pytorch 从自定义数据集创建的列表中调用了列表。

In [1]: sample[1][1]
Out[1]: [0.7, nan, nan, nan, nan]

我想检查列表中是否有 nan 值。我试过了

In [2]: np.nan in sample[1][1]
Out[2]: False

但它返回的是 False 输出。检查其中一个元素,我发现:

In [3]: sample[1][1][4] == np.nan
Out[3]: False

据推测,它一定是真的,因为检查它的类型会提示我:

In [4]: type(sample[1][1][4])
Out[4]: numpy.float64

需要帮助看看我哪里出错了。我希望该列表返回 True,因为它包含一个 nan。任何线索都会有所帮助

【问题讨论】:

  • 你应该使用np.isnan(sample)
  • sample[1][1] 的类型是什么?列表不会发生这种情况。

标签: python numpy


【解决方案1】:

您想为此使用np.isnan,如您在此处看到的:

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

In [6]: np.isnan(np.nan)
Out[6]: True

原因有点深奥,但主要是使用 np.isnan 进行测试。 对于您的特定情况,您可以这样做

any([np.isnan(i) for i in sample[1][1]])

【讨论】:

    【解决方案2】:

    根据我的给定:

    In [1]: sample[1][1]
    Out[1]: [0.7, nan, nan, nan, nan]
    

    我尝试了一种解决方法。感谢np.isnan() 的想法。在数组中添加了布尔值,如果它大于 0,那么它必须有一个 nan。

    In [2]: np.isnan(sample[1][1])
    Out[2]: array([False, True, True, True, True])
    
    In [3]: np.isnan(sample[1][1]).sum()
    Out[3]: 4
    In [4]: np.isnan(sample[1][1]).sum()>0
    Out[3]: True
    

    【讨论】:

      【解决方案3】:

      这是一个奇怪的问题,与为您的 sample[1][1] 对象实现 in 运算符有关。

      解决方案是强制转换为列表:

      In [5]: np.nan in list(sample[1][1])
      Out[5]: True
      

      编辑:这是快速而肮脏的方式。此解决方案依赖于(np.nan is np.nan) == True。但是,这并不保证在所有情况下都是正确的(请参阅this SO question)。因此,最好坚持使用涉及np.isnan(x) 的结构,例如在其他几个答案中给出的。

      【讨论】:

        猜你喜欢
        • 2022-07-21
        • 2021-03-09
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2014-06-12
        • 2021-10-02
        • 2014-11-08
        • 1970-01-01
        相关资源
        最近更新 更多