我有一个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()
个等价物,所以我不必两次转换数据?
答案 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
列上进行排序。