我需要对[0, n)
具有必须始终忽略的值的连续整数范围进行整数数组索引。忽略的值不应出现在结果中。并且有一个独立的 NumPy 布尔长度数组n
(即掩码),指示是否忽略原始范围的元素。
在纯 Python 中,我会这样写:
def get_non_masked_indices(range_mask, indices):
return [i for i in indices if not range_mask[i]]
对于这个输入
# 0 1 2 3 4 5 6 7 8 9
mask = np.array([0, 1, 0, 1, 0, 0, 1, 1, 1, 0], dtype=np.bool)
idxs = np.array([ 2, 3, 4, 7, 9])
# + - + - +
调用的结果get_non_masked_indices(mask, idxs)
是
[2, 4, 9]
这是一种常用的数组处理模式(尤其是在图形算法中)。是否有 NumPy 函数来促进这一点?
到目前为止,我提供了以下选项:
- 原生 NumPy 索引
- 使用索引掩码进行掩码
- 索引屏蔽范围
原生 NumPy 索引:
return indices[np.logical_not(range_mask[indices])]
使用索引掩码进行掩码:
return np.ma.MaskedArray(indices, range_mask[indices]).compressed()
return np.ma.masked_where(range_mask[indices], indices).compressed()
索引屏蔽范围:
return np.ma.MaskedArray(np.arange(len(range_mask)), range_mask)[indices].compressed()
return np.ma.masked_where(range_mask, np.arange(len(range_mask)))[indices].compressed()
来自应用程序的示例
假设我们有一个图,表示为相邻节点的 NumPy 数组列表。
adjacent_nodes = [
np.array([1, 2]),
np.array([0]),
np.array([0]),
]
is_colored = np.array([False, False, True])
我感兴趣的函数只需要返回节点的非彩色邻居:
get_non_masked_indices(is_colored, adjacent_nodes[0]) # -> [1]
get_non_masked_indices(is_colored, adjacent_nodes[1]) # -> [0]
get_non_masked_indices(is_colored, adjacent_nodes[2]) # -> [0]