变更单n​​p.argmax索引取自

时间:2017-07-07 02:29:10

标签: numpy

我有三个矩阵:

one = np.empty((5,5))
one[:] = 10

two = np.empty((5,5))
two[:] = 10 

three = np.empty((5,5))
three[:] = 2

然后我把它们堆叠起来:

stacked = np.dstack([one, two, three])

并最终确定具有最大值的索引:

t_max = np.argmax(stacked, axis=2)

我现在想确定最大值,但需要注意。如果有多个深度具有相同的最大值(如我的例子中所示),我想从最大深度返回索引。

现在t_max返回:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

但我想回复:

[[1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]]

因为第二深度与第一深度具有相同的最大值,但也具有更大的深度。

编辑:

我想我可以先做np.flip(stacked, axis=2),但也许这不是最好的方法。

1 个答案:

答案 0 :(得分:1)

为了提高效率,我建议使用 adb install -r android_emulator_hacks.apk adb shell pm grant no.finn.android_emulator_hacks android.permission.SET_ANIMATION_SCALE adb shell am start -n no.finn.android_emulator_hacks/no.finn.android_emulator_hacks.HackActivity 视图,然后从最后一个轴长度中减去后得到索引,就像这样 -

flipped

另一种没有翻转且稍微长一点的方法是使用累加求和与最大值进行比较,然后使用stacked.shape[-1] - stacked[...,::-1].argmax(-1) - 1 来捕捉这些匹配中的最后一个,就像这样 -

argmax

示例运行 -

(stacked == stacked.max(-1,keepdims=1)).cumsum(-1).argmax(-1)

运行时测试 -

In [29]: stacked = np.random.randint(0,3,(2,5,3))

In [30]: stacked
Out[30]: 
array([[[2, 1, 2],
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 0],
        [1, 2, 2]],

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

In [31]: stacked.shape[-1] - stacked[...,::-1].argmax(-1) - 1
Out[31]: 
array([[2, 2, 2, 1, 2],
       [0, 2, 2, 1, 0]])

In [32]: (stacked == stacked.max(-1,keepdims=1)).cumsum(-1).argmax(-1)
Out[32]: 
array([[2, 2, 2, 1, 2],
       [0, 2, 2, 1, 0]])