如何从列表或数组中获取NaN和inf的索引

时间:2017-07-01 01:07:07

标签: python-3.x numpy indexing nan

我有多个数据列表;我们称他们为a, b, c

import numpy as np

a = [np.NaN, 1, 2, 3, np.NaN, np.NaN, 6]
b = [7, 8, 9, 10, 11, 12, 13]
c = [14, 15, 16, 17, 18, 19, 20]

NaN值出现在a的索引[0, 4, 5];在我的情况下适用于NaNs的所有内容也适用于np.infRather than remove这些索引中单个列表a的值,我想以有效的方式从所有列表a b and c中删除这些索引(实际数据集很大)。我试图通过下面的函数获得这些索引。

def get_nan_idx(data, val=np.NaN):
    # data = np.array(data)
    idxs, = np.where(data == val)
    return idxs

我调用该函数但没有得到所需的结果。

nan_idxs = get_nan_idx(a, np.NaN)
print(nan_idxs)
>> [] # result

如果我没有注释掉行# data = np.array(data),并且我在函数的arg val中使用了浮点数而不是NaN,那么该函数可以工作。

那么为什么这种方法不适用于NaNsinfs?可以修改它以产生所需的结果吗?

编辑:

以下代码基于类似(但不完全相同)问题的链接中提供的答案,在删除NaNs但不是infs时有效。

ii = []
for idx in range(len(a)):
    if a[idx] != a[idx]:
        ii.append(idx)

print(ii)
>> [0, 4, 5]

1 个答案:

答案 0 :(得分:-1)

我找到了一种有效的方法。但仍然很想知道是否还有其他有价值的方法可以做到这一点。

def get_ndex(data, val): # data = a
    if val == 'inf':
        res, = np.where(np.isinf(data))
    elif val == 'nan':
        res, = np.where(np.isnan(data))
    return res