我正在尝试创建一个列表,其中包含列表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
答案 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
支票,它们会 咬你。