3维ndarray的最后一个维度上棘手的numpy argmax问题

3
如果有一个形状为(9,1,3)的数组。
array([[[  6,  12, 108]],

   [[122, 112,  38]],

   [[ 57, 101,  62]],

   [[119,  76, 177]],

   [[ 46,  62,   2]],

   [[127,  61, 155]],

   [[  5,   6, 151]],

   [[  5,   8, 185]],

   [[109, 167,  33]]])

我想找出第三个维度的 argmax 索引, 在这种情况下它应该是185,因此索引为7。

我猜解决方案与重塑(reshaping)有关,但我理解不了。感谢任何帮助!


1
听起来更像是你想要 np.argmax(yourarray[:, 0, 2]) - Paul Panzer
1
说“第三维的argmax索引”并没有太多意义。你可以询问argmax的第三个坐标(它应该是2,而不是7),或者第一个坐标(应该是7),或在取[:,0,2]切片数组后的argmax(正如PP所建议的那样,这确实是7)。 - DSM
我不明白为什么每个项目都是一个单例列表,这似乎是一种糟糕的建模方式。 - Willem Van Onsem
@PaulPanzer,np.argmax(np.max(arr, 2)) 怎么样? - kmario23
@kmario23 还是 np.unravel_index(np.argmax(arr), arr.shape)?只要能得到一个包含数字七的结果。 - Paul Panzer
2个回答

2
我不确定其中有什么棘手的地方。但是,找到沿着最后一个轴的最大元素的索引的一种方法是使用 np.maxnp.argmax,如下所示:
# find `max` element along last axis 
# and get the index using `argmax` where `arr` is your array
In [53]: np.argmax(np.max(arr, axis=2))
Out[53]: 7

另外,正如@PaulPanzer在评论中建议的那样,你可以使用以下方法:

In [63]: np.unravel_index(np.argmax(arr), arr.shape)
Out[63]: (7, 0, 2)

In [64]: arr[(7, 0, 2)]
Out[64]: 185

1
哦,请不要推广我的随意评论;-)或者,如果你一定要用另一个,我认为那个更好。 - Paul Panzer
1
谢谢,棘手程度是相对的,我还没有花那么多时间来学习np,不过以后会的。 - Tshosh Harris
@TshoshHarris 当然可以!但是你不必特别道谢。如果回答对你有帮助,请在SO上给它点赞,这已经足够了。 - kmario23
1
@kmario23 你说得对,我也这么认为,但是你必须获得15个声望才能看到它 ;) - Tshosh Harris

1
你可能需要这样做:
data = np.array([[[  6,  12, 108]],

   [[122, 112,  38]],

   [[ 57, 101,  62]],

   [[119,  76, 177]],

   [[ 46,  62,   2]],

   [[127,  61, 155]],

   [[  5,   6, 151]],

   [[  5,   8, 185]],

   [[109, 167,  33]]])

np.argmax(data[:,0][:,2])
 7

1
data[:, 0][:, 2] 是什么意思?请直接使用 data[:, 0, 2],而不是创建一个不必要的中间变量。 - Paul Panzer
是的,非常好。但是通过传播这种粗心大意的行为并没有帮助到任何人。 - Paul Panzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接