任意按列对矩阵排序

4

我有一个类似于以下矩阵:

[[col1,col2,col3,col4,col5],
 [4,1,3,6,2],
 [9,4,1,3,6]]

我希望能够任意地按列重新排序矩阵,例如:
[[col3,col1,col5,col4,col2],
 [3,4,2,6,1],
 [1,9,6,3,4]]

我知道如果这只是一行数据,我可以创建一个顺序列表,像 order_list = [2,0,4,3,1] 然后使用列表推导式 ordered_list = [old_list[i] for i in order_list] 但在这里,我无法想出一种方法来为每一行创建一个嵌套的推导式来执行此操作。

2个回答

3
我建议使用NumPy的高级索引。
>>> import numpy as np
>>> a = np.array([[4,1,3,6,2], [9,4,1,3,6]])                                                                                           
>>> cols = [2,0,4,3,1]                                                                                                                 
>>> a.T[cols].T                                                                                                                        
>>> 
array([[3, 4, 2, 6, 1],
       [1, 9, 6, 3, 4]])

Details: 细节:
>>> a
array([[4, 1, 3, 6, 2],
       [9, 4, 1, 3, 6]])
>>> a.T
array([[4, 9],
       [1, 4],
       [3, 1],
       [6, 3],
       [2, 6]])
>>> a.T[cols]
array([[3, 1],
       [4, 9],
       [2, 6],
       [6, 3],
       [1, 4]])
>>> a.T[cols].T
array([[3, 4, 2, 6, 1],
       [1, 9, 6, 3, 4]])

感谢您的评论。我正在处理的实际矩阵比示例要大得多。它有10列和800行+1个标题行。在获取数组的转置后,我尝试执行a.T [cols] 部分,但它显示“轴0的大小为9,索引9超出了范围”。 - realkes
@ykesen,一个大小为9的轴的最后一个索引是8,所以你得到的错误是预期的。 - timgeb

2
如果你需要使用列表推导式。
拥有一个列表。
l=[[2,0,1],[4,5,6],[7,8,9]]

使用一些列表切片技巧,您可以完成以下操作:
>>> [[x[i] for i in l[0]] for x in l[1:]]
[[6, 4, 5], [9, 7, 8]]

如果您想要整个数组,可以这样做:
>>> [l[0]]+[ [x[i] for i in l[0]] for x in l[1:]]
[[2, 0, 1], [6, 4, 5], [9, 7, 8]]

谢谢您的评论。实际上,我想要对列表进行排序,而不是子列表中的元素。因此,在主列表中,我希望根据第一个元素对子列表进行排序。 - realkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接