我有多个数据列表;我们称他们为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.inf
。 Rather 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,那么该函数可以工作。
那么为什么这种方法不适用于NaNs
和infs
?可以修改它以产生所需的结果吗?
编辑:
以下代码基于类似(但不完全相同)问题的链接中提供的答案,在删除NaNs
但不是infs
时有效。
ii = []
for idx in range(len(a)):
if a[idx] != a[idx]:
ii.append(idx)
print(ii)
>> [0, 4, 5]
答案 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