Python 使用numpy按另一个列表对矩阵的行和列进行排序
我有一个正方形的NxN矩阵。这个矩阵通常相当大(N大约5000),我想把这个矩阵的各个部分聚合起来,形成一个更小的矩阵 因此,我有一个包含N个元素的列表,这些元素表示哪些行/列应该在新矩阵中分组在一起 为了使算法更简单更快,我想根据上面的列表对行和列进行排序 例如: 输入5x5矩阵: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 |
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生成带有索引的列表。