0

我需要对[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]
4

0 回答 0