屏蔽数组索引问题

2024-04-19 20:35:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有一些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可以更有效地实现这一点吗?你知道吗


Tags: 数据numpy算法falsetruemask数组逻辑
2条回答

您可以创建一个索引数组(使用^{}),然后屏蔽该数组,最后使用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])

可以展平从原始数组返回索引的掩码,然后使用新索引来子集掩码索引:

mask = np.array([ True, False, True, False, False, True, True, True ])
indices = [1,3]

np.flatnonzero(mask)[indices]
# array([2, 6])

相关问题 更多 >