1

長さがnの列ベクトルyがあり、サイズがn * mの行列Xがあるとします。私は、要素が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の両方を反復することができますが、これを行うにはより効率的な方法がありますか?

+0

です]) '? – Eric

答えて

1
使用

ベクトル化のアプローチbroadcasting -

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

サンプル実行 - あなたは、出力は `np.array([TrueまたはFalse、TrueまたはFalseにしたくないことを確認

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]) 
+1

私は、 'any(1)'は分かりやすくするために '.any(axis = 1)'と綴るべきだと主張したい – Eric

関連する問題