我有一个带有一些NaN
值的numpy数组:
arr = [ 0, NaN, 2, NaN, NaN, 5, 6, 7 ]
使用一些逻辑(在问题范围之外),我生成一个NaN位置的掩码:
mask = [ True, False, True, False, False, True, True, True ]
我使用此掩码仅选择有效数据:
valid_arr = arr[mask] # [ 0, 2, 5, 6, 7 ]
然后我执行一个任意算法,在这个新数组中选择几个indeces
:
indeces = myAlgo(valid_arr) # [ 1, 3 ]
有效数组中的indeces
为1,3(对应于值2和6)。我需要知道这些indeces
对应于原始数组中的 (arr
)。在上面的例子中,这显然是 2和6 。
数组是时间序列数据,未排序。一种解决方案是迭代mask
,仅在找到有效数字时递增计数器。使用numpy可以更有效地完成这项工作吗?
答案 0 :(得分:3)
您可以平滑从原始数组返回索引的掩码,然后使用新索引对掩码索引进行子集化:
mask = np.array([ True, False, True, False, False, True, True, True ])
indices = [1,3]
np.flatnonzero(mask)[indices]
# array([2, 6])
答案 1 :(得分:2)
你可以创建一个索引数组(使用np.arange
)然后屏蔽它,最后使用advanced indexing using an integer array来获取相应的项目:
>>> mask = np.array([ True, False, True, False, False, True, True, True ])
>>> np.arange(mask.size)[mask][[1, 3]]
array([2, 6])