[0, n)
常に無視する必要がある値を持つ連続整数範囲の整数配列インデックスを作成する必要があります。無視された値は結果に表示されません。n
また、元の範囲の要素が無視されるかどうかを示す、長さのスタンドアロンの NumPy ブール配列(つまり、マスク) があります。
純粋な 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]