【问题标题】:How to get the index of maximum values along 2d in a 4d numpy array如何在 4d numpy 数组中获取沿 2d 的最大值的索引
【发布时间】:2022-01-15 10:55:53
【问题描述】:

假设你有一个 3d 数组,例如

A = np.array([[[1,2], [2,3] ], [[3,4], [1,2]], [[2,3], [3,4]]])

A.shape (3, 2, 2)

array([[[1, 2],
        [2, 3]],

       [[3, 4],
        [1, 2]],

       [[2, 3],
        [3, 4]]])

现在,如果我想沿第一个维度获取最大值的索引,这很简单

A.argmax(axis=0)

array([[1, 1],
       [2, 2]])

如何对 4d 数组执行相同的操作,以找到沿前两个维度的最大值?

4d 数组示例

np.random.randint(0, 9,[2,3,2,2])

B = array([[[[5, 4],
         [3, 8]],

        [[3, 5],
         [0, 4]],

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


       [[[0, 2],
         [7, 3]],

        [[7, 3],
         [8, 0]],

        [[8, 3],
         [2, 7]]]])

B.shape (2, 3, 2, 2)

在这种情况下,输出仍然应该是一个(2, 2) 矩阵,但每个单元格都包含一个维数为 0 和维数为 1 的最大索引的元组,即

示例输出

array([[(1, 2), (0, 1)],
       [(1, 1), (0, 0)]])

解决方案

正如@hpaulj 正确指出的那样,这个问题的解决方案在于调用

idx = B.reshape(6,2,2).argmax(axis=0)
2d_indices = np.unravel_index(idx,(2,3))

但是,这种方式的排序与我的预期有点不同(并在我上面的问题中概述)。要得到与上面完全相同的输出,只需添加

list_of_tuples = [a for a in zip(2d_indices[0].flatten(), 2d_indices[1].flatten())]
np.array(list_of_tuples).reshape(3, 3, -1)

对我来说看起来有点麻烦,可能有更直接的方法可以到达那里,但为了完整起见,我仍然想发布它:)

【问题讨论】:

  • 能否展示您的 4D 阵列样本?
  • 我添加了一个 4d 示例并更改了反映预期结果的输出

标签: python arrays numpy max argmax


【解决方案1】:

argmax 只接受标量轴值(其他一些函数允许元组)。但我们可以重塑B

In [18]: B.reshape(6,2,2).argmax(axis=0)
Out[18]: 
array([[5, 1],
       [4, 0]])

并将它们转换回二维索引:

In [21]: np.unravel_index(_18,(2,3))
Out[21]: 
(array([[1, 0],
        [1, 0]]),
 array([[2, 1],
        [1, 0]]))

这些值可以通过多种方式重新排序,例如:

In [23]: np.transpose(_21)
Out[23]: 
array([[[1, 2],
        [1, 1]],

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

【讨论】:

  • 相似(但不相同)输出可以由B.argmax(axis=1)[::-1]产生
  • 谢谢@hpaulj!这很有帮助!我不明白的是结果的顺序。在您调用np.transpose(_21) 之后,矩阵的上半部分按照我的预期排序。下半部分,然而,不是。我对 3x3 矩阵做了同样的事情,而且排序也混淆了。我正在努力解决这个谜题,但是,如果您能提供答案,我很乐意接受您的回复!
  • Out[21] 是一对可用于B 的数组,第一个用于第一维,第二个用于第二维。您的 (1,2) 是一个子数组的索引。我可以问你在哪里/为什么选择那个布局吗?你将如何使用它?它不能直接索引B。我的有。
  • 是的,你是对的,我也刚刚意识到这一点!
猜你喜欢
  • 2017-03-27
  • 2021-01-15
  • 1970-01-01
  • 2019-11-18
  • 2011-07-25
  • 2022-01-09
  • 2011-10-18
相关资源
最近更新 更多