如何在Python中按列排序矩阵而不改变其大小?



例如,考虑矩阵:

matrix=[[2,5,7],[6,3,1],[9,8,7]]

按列排序的矩阵为:

matrix_sorted=[[1,4,7],[2,5,8],[3,6,9]]

当矩阵的行数和列数不同时:

matrix2=[[7,1],[2,6],[3,5]]

排序矩阵为:

matrix2_sorted=[[1,4],[2,5],[3,6]]

当从矩阵x2中获得所有数字时,我得到列表:

numbers=[1,2,3,5,6,7]

我试着做一个新的矩阵,然后转置它:

n=3 //number of rows
m=2 //number of columns
new_matrix2=[]
for i in range(n):
temp=[]
for j in range(m):
temp.append(numbers[0])
numbers.pop(0)
new_matrix.append(temp)
new_matrix2_T=[]
for i in range(m):
column=[row[i] for row in new_matrix]
reversed_matrix.append(column)

但是转置得到一个不同大小的矩阵

new_matrix2_T=[[1,3,6],[2,5,7]]

您的数据当前在列表的列表中。

我个人认为列表的列表不是一个方便的数据结构来满足你的要求。

我建议使用numpy数组,它可以很容易地平坦化,排序,然后重塑。

不幸的是,重塑数组的标准numpy函数/方法倾向于按行填充,而不是按列填充。你可以通过对高度和宽度求反然后对矩阵求转置来解决这个问题。

import numpy as np
def sorted_by_columns(mat):
a = np.array(matrix)
h,w = a.shape
a = np.sort(a.ravel()).reshape((w, h)).T
return a
matrix=[[7,1],[2,6],[3,5]]
sorted_mat = sorted_by_columns(matrix)
print(sorted_mat)
# [[1 5]
#  [2 6]
#  [3 7]]

文档:

  • .reshape;
  • .ravel;
  • .T;
  • numpy.sort。

最新更新