我有一个正方形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 |
要清楚:第一行是[5 4 3 2 1],第一行是[5,10,15,20,25]。
包含'labels'的列表,表示应在新矩阵中将哪些行和列组合在一起:
[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经验的人,我发现很难完成我想要的排序。
提前致谢!
答案 0 :(得分:4)
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]])