2017-07-12 13 views
8

2つのベクトルが与えられているので、私はインジケータ行列を作成したいと思います。例えば、a=np.array([5,5,3,4,4,4])与えられた、とb=np.array([5,4,3])は、結果がPythonで2つの配列からインジケータ行列を作成するNumpy

5 4 3 

5 1 0 0 
5 1 0 0 
3 0 0 1 
4 0 1 0 
4 0 1 0 
4 0 1 0 

これを達成する最も簡単な方法は何であるべきか?使用

答えて

11

NumPy broadcasting -

(a[:,None]==b).astype(int) 

サンプル実行 -

In [107]: (a[:,None]==b)*1 
Out[107]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 0], 
     [0, 1, 0]]) 

-

In [104]: a 
Out[104]: array([5, 5, 3, 4, 4, 4]) 

In [105]: b 
Out[105]: array([5, 4, 3]) 

In [106]: (a[:,None]==b).astype(int) 
Out[106]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 0], 
     [0, 1, 0]]) 

場合は、最も簡単なことで、あなたがコンパクトな意味では、ここでは型変換を行うための改良一つです説明:Nonenumpy.newaxisのエイリアスで、新しい軸(length=1の軸)を追加するために使用されます。したがって、この場合、a[:,None]で、の2Dバージョンが得られます。これには2Dバージョン、a.reshape(-1,1)のいずれかを使用する方法があります。これによりを1Dbと比較すると、一致する2D配列、ブール値配列が得られます。最後のステップはint配列への変換です。

ステップ・バイ・ステップの実行 -

In [141]: a 
Out[141]: array([5, 5, 3, 4, 4, 4]) 

In [142]: b 
Out[142]: array([5, 4, 3]) 

In [143]: a[:,None] 
Out[143]: 
array([[5], 
     [5], 
     [3], 
     [4], 
     [4], 
     [4]]) 

In [144]: a[:,None] == b 
Out[144]: 
array([[ True, False, False], 
     [ True, False, False], 
     [False, False, True], 
     [False, True, False], 
     [False, True, False], 
     [False, True, False]], dtype=bool) 

In [145]: (a[:,None] == b).astype(int) 
Out[145]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 0], 
     [0, 1, 0]]) 
+0

ありがとうございました!これはまさに私が探していたものでした。 – David

+0

'a [:、None]'は 'a.reshape(-1,1)'と同じように見えます。どのようにこれが正確に動作するか説明できますか? – David

+0

@David投稿にコメントがほとんど追加されていません。彼らは願っています! – Divakar

関連する問題