掩码数组索引问题

时间:2017-08-16 23:33:33

标签: python arrays numpy indexing

我有一个带有一些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可以更有效地完成这项工作吗?

2 个答案:

答案 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])