numpy:对列表列表进行排序,或者:按行对矩阵进行排序

时间:2018-10-15 11:23:34

标签: python sorting numpy

我有一个numpy矩阵,其中包含行向量。我想按矩阵的行对矩阵进行排序,就像Python对列表的列表进行排序一样:

import numpy as np
def sortx(a):
    return np.array(sorted([list(i) for i in a]))

a = np.array([[1,4,0,2],[0,2,3,1]])
print(sortx(a))

输出:

[[0 2 3 1]
 [1 4 0 2]]

我的numpy函数是否有sortx()个等价物,所以我不必两次转换数据?

2 个答案:

答案 0 :(得分:3)

您可以尝试使用numpy的lexsort

a=a[np.lexsort(a[:,::-1].T)]

在我的机器上,将其应用于4x4矩阵时,其速度大约是sortx方法的四倍。在具有100行的矩阵上,速度差异甚至更大。

arr=np.random.randint(0,100,(100,4))
%timeit np.lexsort(arr[:,::-1].T)
#6.29 µs +- 27.1ns
% timeit sortx(arr)
# 112µs +- 1.2µs

编辑:

Andyk建议使用sortx()方法的改进版本。

def sortx_andyk(a):
    return np.array(sorted(a.tolist())

此方法的时间:

%timeit sortx_andryk(arr)
# 43µs +- 169ns

答案 1 :(得分:0)

您可以使用np.sort(arr, axis=0) 就您而言

import numpy as np
a = np.array([[1,4,0,2],[0,2,3,1]])
np.sort(a, axis=0)

修改

即使我对您的问题没有确切答案,我还是误解了这个问题,您也许可以使用argsort。这将返回索引以对数组进行排序。但是,它仅基于轴执行此操作。可以使用它根据特定列对数组进行排序,例如首先。那你就这样使用它

a = a[a.argsort(axis=0)[:, 0]]

其中[:, 0]指定要进行排序的列,即[:, n]将在第n列上进行排序。