3

長さ n の列ベクトル y があり、サイズ n*m の行列 X があるとします。y の各要素 i について、要素が X の対応する行にあるかどうかを確認したいのですが、これを行う最も効率的な方法は何ですか?

例えば:

y = [1,2,3,4].T

X =[[1, 2, 3],[3, 4, 5],[4, 3, 2],[2, 2, 2]]

次に、出力は次のようになります

[1, 0, 1, 0] or [True, False, True, False] 

どちらか簡単です。

もちろん、for ループを使用して y と X の両方を反復処理できますが、これを行うより効率的な方法はありますか?

4

1 に答える 1

4

broadcasting-を使用したベクトル化されたアプローチ

((X == y[:,None]).any(1)).astype(int)

サンプルラン -

In [41]: X        # Input 1
Out[41]: 
array([[1, 2, 3],
       [3, 4, 5],
       [4, 3, 2],
       [2, 2, 2]])

In [42]: y        # Input 2
Out[42]: array([1, 2, 3, 4])

In [43]: X == y[:,None] # Broadcasted  comparison
Out[43]: 
array([[ True, False, False],
       [False, False, False],
       [False,  True, False],
       [False, False, False]], dtype=bool)

In [44]: (X == y[:,None]).any(1) # Check for any match along each row
Out[44]: array([ True, False,  True, False], dtype=bool)

In [45]: ((X == y[:,None]).any(1)).astype(int) # Convert to 1s and 0s
Out[45]: array([1, 0, 1, 0])
于 2016-10-21T11:21:17.833 に答える