【发布时间】:2021-06-22 18:37:56
【问题描述】:
我已经多次看到这个问题的变体,但到目前为止还没有看到任何能触及这个一般案例核心的答案。我有一个形状为 [a, b, c, ...] 的 n 维数组。对于某个维度x,我想查看每个子数组并找到最大值的坐标。
例如说b = 2,这就是我感兴趣的维度。我想要[:, 0, :, ...]和[:, 1, :, ...]的最大值的坐标,格式为a_max = [a_max_b0, a_max_b1], c_max = [c_max_b0, c_max_b1],等。
我尝试通过沿 axis 0 使用 argmax 将输入矩阵重塑为二维数组 [b, a*c*d*...] 并解开索引,但输出坐标不最后在我的数据集中给出最大值。在这种情况下,n = 3 和我对 axis 1 感兴趣。
shape = gains_3d.shape
idx = gains_3d.reshape(shape[1], -1)
idx = idx.argmax(axis = 1)
a1, a2 = np.unravel_index(idx, [shape[0], shape[2]])
显然我可以使用循环,但这不是很pythonic。
举个具体的例子,我随机生成了一个 4x2x3 的数组。我对轴 1 感兴趣,所以输出应该是两个长度为 2 的数组。
testarray = np.array([[[0.17028444, 0.38504759, 0.64852725],
[0.8344524 , 0.54964746, 0.86628204]],
[[0.77089997, 0.25876277, 0.45092835],
[0.6119848 , 0.10096425, 0.627054 ]],
[[0.8466859 , 0.82011746, 0.51123959],
[0.26681694, 0.12952723, 0.94956865]],
[[0.28123628, 0.30465068, 0.29498136],
[0.6624998 , 0.42748154, 0.83362323]]])
testarray[:,0,:]是
array([[0.17028444, 0.38504759, 0.64852725],
[0.77089997, 0.25876277, 0.45092835],
[0.8466859 , 0.82011746, 0.51123959],
[0.28123628, 0.30465068, 0.29498136]])
,所以第一个输出数组的第一个元素为2,另一个的第一个元素为0,指向0.8466859。两个矩阵的第二个元素会是2和2,指向testarray[:,1,:]的0.94956865
【问题讨论】:
-
请发布一个带有示例的具体 MCVE。我很难理解你真正想要什么。有些字是
gains_3d.argmax(1),但有些不是 -
@MadPhysicist 好点。已编辑
标签: python arrays numpy matrix argmax