2016-11-01 5 views
0

私はndarrayを持っています。最後の次元の非最大要素をすべて0に設定します。Numpy:ndarrayの非最大要素を0で埋めよう

a = np.array([[[1,8,3,4],[6,7,10,6],[11,12,15,4]], 
       [[4,2,3,4],[4,7,9,8],[41,14,15,3]], 
       [[4,22,3,4],[16,7,9,8],[41,12,15,43]] 
      ]) 
print(a.shape) 
(3,3,4) 

I)は(np.argmaxによって最大要素のインデックスを取得することができ:

明らか
b = np.argmax(a, axis=2) 
b 
array([[1, 2, 2], 
     [0, 2, 0], 
     [1, 0, 3]]) 

、bが1つの未満の寸法を有します。さて、私は最大値がどこにあるかを除いてすべてゼロを持つ新しい3次元配列を得たいと思います。

私はこの配列を取得したい:これを達成する

np.array([[[0,1,0,0],[0,0,1,0],[0,0,1,0]], 
      [[1,0,0,1],[0,0,1,0],[1,0,0,0]], 
      [[0,1,0,0],[1,0,0,0],[0,0,0,1]] 
     ]) 

一つの方法を、私はこれらのテンポラリ配列

b = np.repeat(b[:,:,np.newaxis], 4, axis=2) 
t = np.repeat(np.arange(4).reshape(4,1), 9, axis=1).T.reshape(b.shape) 

z = np.zeros(shape=a.shape, dtype=int) 
z[t == b] = 1 
z 
array([[[0, 1, 0, 0], 
    [0, 0, 1, 0], 
    [0, 0, 1, 0]], 

    [[1, 0, 0, 0], 
    [0, 0, 1, 0], 
    [1, 0, 0, 0]], 

    [[0, 1, 0, 0], 
    [1, 0, 0, 0], 
    [0, 0, 0, 1]]]) 

に、より効率的な方法でこれを取得するにはどのように任意のアイデアを作成してみましたか?

答えて

1

はここで放送を使用しています一つの方法です:

In [108]: (a == a.max(axis=2, keepdims=True)).astype(int) 
Out[108]: 
array([[[0, 1, 0, 0], 
     [0, 0, 1, 0], 
     [0, 0, 1, 0]], 

     [[1, 0, 0, 1], 
     [0, 0, 1, 0], 
     [1, 0, 0, 0]], 

     [[0, 1, 0, 0], 
     [1, 0, 0, 0], 
     [0, 0, 0, 1]]]) 
+0

OMG、それは素晴らしいことです!ありがとう@ワーレン:) –

関連する問題