即使数据类型在逻辑上正确,也无法检测列表中的nan值



我调用了使用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,如您在此处所见:

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]])

来自我的给定:

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

这是一个奇怪的问题,在某种程度上与sample[1][1]对象的in运算符的实现有关。

解决方案是投射到一个列表:

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

编辑:这是一种快速而肮脏的方式。此解决方案依赖于(np.nan is np.nan) == True。然而,这并不能保证在所有情况下都是正确的(见SO问题(。因此,最好坚持使用一个包含np.isnan(x)的结构,比如其他几个答案中给出的结构。

最新更新