按列任意排序矩阵

时间:2018-11-12 13:46:10

标签: python sorting list-comprehension

我有一个类似的矩阵:

[[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 个答案:

答案 0 :(得分: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]])

详细信息:

>>> 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]])

答案 1 :(得分: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]]