如何获取列表中所有NaN的所有索引?

时间:2019-05-17 19:44:48

标签: python numpy nan

我正在尝试创建一个列表,其中包含列表NaNs中所有a的索引。

问题在于列表ind中没有任何内容。如果我放置NaN之类的随机字符串而不是c,那么它会起作用。

import numpy as np

a=[1, 2, 3, 4, np.nan, np.nan, 2, np.nan]

ind=[]
for i in range(0,len(a)):

    if a[i]==float("NaN"):
        ind.append(i)
print ind

2 个答案:

答案 0 :(得分:1)

使用np.nan进行比较

import numpy as np

a=[1,2,3,4,np.nan,np.nan,2,np.nan]

ind=[]
for i in range(0,len(a)):
    if a[i] is np.nan:
        ind.append(i)
print ind

输出

[4, 5, 7]

使用列表理解:

[x  for x in range(0,len(a)) if a[x] is np.nan]

或者,如果您使用numpy函数构建了数组,请使用np.isnan(a[i])进行比较。

答案 1 :(得分:0)

如果您使用的是NumPy,则应该真正开始使用数组,并摆脱在Python级别手动循环的习惯。手动循环通常比让NumPy处理事情要慢大约100倍,而浮点数列表大约要占用数组内存的4倍。

在这种情况下,NumPy可以非常简单地为您提供一系列NaN索引:

ind = numpy.where(numpy.isnan(a))[0]

numpy.isnan给出一个布尔数组,告诉a的哪些元素为NaN。 numpy.where给出了True个元素的索引数组,但是为了与多维数组上的行为保持一致,包裹在1个元素的元组中,因此[0]从元组中提取数组。

a是列表时,此方法有效,但是您实际上应该使用数组。


您的尝试失败,因为NaN值彼此不相等或彼此不相等:

>>> numpy.nan == numpy.nan
False
>>> numpy.nan == float('nan')
False

NaN的这种设计目的是为了算法上的方便,使x != x在产生要比较的NaN的环境中比较麻烦,并且因为NaN很少使用有效载荷< / em>组件在不同的NaN之间可能会有所不同。


另一个答案建议进行is numpy.nan测试,但这是错误的并且不可靠。仅当您的NaN恰好是特定对象numpy.nan时才有效,这种情况很少发生:

>>> float('nan') is numpy.nan
False
>>> numpy.float64(0)/0 is numpy.nan
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
False
>>> numpy.array([numpy.nan])[0] is numpy.nan
False

依靠is numpy.nan支票,它们会 咬你。