首页 > 解决方案 > 从最大到最小对二维矩阵元素进行排序,也跟踪 ij 索引

问题描述

给定一个上三角矩阵(或下三角)

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

我想将它的值从最大到最小排序,跟踪 ij 索引,所以例如在这个矩阵中我想要类似的东西

6, (2,2)
5, (1,2)
4, (1,1)
3, (0,2)
2, (0,1)
1, (0,0)

这个简单的例子使用了一个整数矩阵,但它应该处理浮点数以及任意大的矩阵,通常在 10x10 到 40x40 之间。速度不是很重要,它是一次性操作。此外,它不需要上下,矩阵是对称的,所以如果更容易,我可以简单地填充相反的三角形。

我试过np.argsort()了,但这只是给了

array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]], dtype=int64)

也就是说,它独立地对每一行进行排序。这没有多大帮助,因为我不想要每行中最大元素的列表,可能是一行具有所有最大值。

标签: pythonsortingmatrix

解决方案


您可以使用此答案中显示的代码(假设您否定您的数组)来执行“2d argsort”。

>>> A = np.array([[1, 2, 3], [0, 4, 5], [0, 0, 6]])

>>> A
array([[1, 2, 3],
       [0, 4, 5],
       [0, 0, 6]])

>>> np.dstack(np.unravel_index(np.argsort(-A.ravel()), (3, 3)))
array([[[2, 2],
        [1, 2],
        [1, 1],
        [0, 2],
        [0, 1],
        [0, 0],
        [1, 0],
        [2, 0],
        [2, 1]]], dtype=int64)

PS:如果任何对自己的 numpy 技能有信心的用户觉得这应该是骗子,请标记它,同时这将是Stef 在评论中建议的“社区 Wiki” 。


推荐阅读