0

ndarray があり、最後の次元の最大値以外のすべての要素をゼロに設定したいと考えています。

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)

np.argmax() で最大要素のインデックスを取得できます。

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

明らかに、b は a よりも 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]]
         ])

これを達成する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]]])

これをより効率的な方法で取得する方法はありますか?

4

1 に答える 1

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]]])
于 2016-11-01T03:52:44.547 に答える