Python 使用numpy按另一个列表对矩阵的行和列进行排序

Python 使用numpy按另一个列表对矩阵的行和列进行排序,python,numpy,matrix,Python,Numpy,Matrix,我有一个正方形的NxN矩阵。这个矩阵通常相当大(N大约5000),我想把这个矩阵的各个部分聚合起来,形成一个更小的矩阵 因此,我有一个包含N个元素的列表,这些元素表示哪些行/列应该在新矩阵中分组在一起 为了使算法更简单更快,我想根据上面的列表对行和列进行排序 例如: 输入5x5矩阵: row/col | 1 | 2 | 3 | 4 | 5 | 1 | 5 | 4 | 3 | 2 | 1 | 2 | 10 | 9 | 8 | 7 | 6 |

我有一个正方形的NxN矩阵。这个矩阵通常相当大(N大约5000),我想把这个矩阵的各个部分聚合起来,形成一个更小的矩阵

因此,我有一个包含N个元素的列表,这些元素表示哪些行/列应该在新矩阵中分组在一起

为了使算法更简单更快,我想根据上面的列表对行和列进行排序

例如:

输入5x5矩阵:

row/col |  1 |  2 |  3 |  4 |  5 |
      1 |  5 |  4 |  3 |  2 |  1 |
      2 | 10 |  9 |  8 |  7 |  6 |
      3 | 15 | 14 | 13 | 12 | 11 |
      4 | 20 | 19 | 18 | 17 | 16 |
      5 | 25 | 24 | 23 | 22 | 21 |
需要说明的是:第一行是[54321],第一列是[5,10,15,20,25]

包含“标签”的列表,这些标签表示应在新矩阵中将哪些行和列分组在一起:

[2 2 1 3 3]
这意味着新矩阵将为3x3(我们有3个不同的值)

带有标签的矩阵:

labels             2       1      3
               --------- ---- ---------
      row/col |  1 |  2 |  3 |  4 |  5 |
   2 |      1 |  5 |  4 |  3 |  2 |  1 |
   2 |      2 | 10 |  9 |  8 |  7 |  6 |
   1 |      3 | 15 | 14 | 13 | 12 | 11 |
   3 |      4 | 20 | 19 | 18 | 17 | 16 |
   3 |      5 | 25 | 24 | 23 | 22 | 21 |
预期排序矩阵:

row/col |  3 | 1 |  2 |  4 |  5 |
      3 | 13 |15 | 14 | 12 | 11 |
      1 |  3 | 5 |  4 |  2 |  1 |
      2 |  8 |10 |  9 |  7 |  6 |
      4 | 18 |20 | 19 | 17 | 16 |
      5 | 23 |25 | 24 | 22 | 21 |
通过这个矩阵,我可以很容易地将分组的元素相加,形成3x3矩阵中的一个新元素。请注意,第三列和第三行已移到前面/顶部,因为它的标签值较低(1与2和3)

问题是:如何使用numpy以这种方式对矩阵进行排序?我搜索了其他问题,找到了lexsort、记录数组和其他东西,但作为一个对numpy没有太多经验的人,我发现很难完成我想要的排序


提前谢谢

numpy
允许您对数组或列表进行索引,因此更改列和行的顺序很容易

我想这就是你想要的:

>>> a = np.arange(25).reshape(5,5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])   

  >>> a[[2,0,1,3,4]] [:,[2,0,1,3,4]]
array([[12, 10, 11, 13, 14],
       [ 2,  0,  1,  3,  4],
       [ 7,  5,  6,  8,  9],
       [17, 15, 16, 18, 19],
       [22, 20, 21, 23, 24]])
作为旁注:

如果只想更改行的顺序,请执行以下操作:

>>> a[[2,0,1,3,4]]
array([[10, 11, 12, 13, 14],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
如果只想更改列的顺序,请执行以下操作:

>>> a[:,[2,0,1,3,4]] 
array([[ 2,  0,  1,  3,  4],
       [ 7,  5,  6,  8,  9],
       [12, 10, 11, 13, 14],
       [17, 15, 16, 18, 19],
       [22, 20, 21, 23, 24]])

numpy
允许对数组或列表进行索引,因此更改列和行的顺序很容易

我想这就是你想要的:

>>> a = np.arange(25).reshape(5,5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])   

  >>> a[[2,0,1,3,4]] [:,[2,0,1,3,4]]
array([[12, 10, 11, 13, 14],
       [ 2,  0,  1,  3,  4],
       [ 7,  5,  6,  8,  9],
       [17, 15, 16, 18, 19],
       [22, 20, 21, 23, 24]])
作为旁注:

如果只想更改行的顺序,请执行以下操作:

>>> a[[2,0,1,3,4]]
array([[10, 11, 12, 13, 14],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
如果只想更改列的顺序,请执行以下操作:

>>> a[:,[2,0,1,3,4]] 
array([[ 2,  0,  1,  3,  4],
       [ 7,  5,  6,  8,  9],
       [12, 10, 11, 13, 14],
       [17, 15, 16, 18, 19],
       [22, 20, 21, 23, 24]])

啊,是的,连同
numpy.lexsort
我现在有了一个有效的解决方案。我使用lexsort生成带有索引的列表。啊,是的,连同
numpy.lexsort
我现在有了一个有效的解决方案。我使用lexsort生成带有索引的列表。