我如何排序一个NumPy数组的第n列?

例如,给定:

a = array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])

我想对a的行按第二列进行排序,得到:

array([[7, 0, 5],
       [9, 2, 3],
       [4, 5, 6]])

当前回答

简单地使用排序,使用您想要排序的列号。

a = np.array([1,1], [1,-1], [-1,1], [-1,-1]])
print (a)
a = a.tolist() 
a = np.array(sorted(a, key=lambda a_entry: a_entry[0]))
print (a)

其他回答

正如Python文档wiki所建议的:

a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]); 
a = sorted(a, key=lambda a_entry: a_entry[1]) 
print a

输出:

[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]

熊猫的方法只是为了完整性:

a = np.array([[9, 2, 3],
              [4, 5, 6],
              [7, 0, 5]])              
a = pd.DataFrame(a) 

             
a.sort_values(1, ascending=True).to_numpy()
array([[7, 0, 5], # '1' means sort by second column
       [9, 2, 3],
       [4, 5, 6]])

prl900 基准测试,与公认的答案相比:

%timeit pandas_df.sort_values(9, ascending=True)
1000 loops, best of 3: 400 µs per loop

%timeit numpy_table[numpy_table[:,9].argsort()]
10000 loops, best of 3: 180 µs per loop  

这是一个老问题,但如果你需要将其推广到高于2维的数组,下面是可以很容易推广的解决方案:

np.einsum('ij->ij', a[a[:,1].argsort(),:])

对于二维来说,这是一个过度的处理,对于@steve的答案,一个[a[:,1].argsort()]就足够了,但是这个答案不能推广到更高的维度。你可以在这个问题中找到一个3D数组的例子。

输出:

[[7 0 5]
 [9 2 3]
 [4 5 6]]
def sort_np_array(x, column=None, flip=False):
    x = x[np.argsort(x[:, column])]
    if flip:
        x = np.flip(x, axis=0)
    return x

数组在原来的问题:

a = np.array([[9, 2, 3],
              [4, 5, 6],
              [7, 0, 5]])

问题作者所期望的sort_np_array函数的结果:

sort_np_array(a, column=1, flip=False)
[2]: array([[7, 0, 5],
            [9, 2, 3],
            [4, 5, 6]])

#用于按列1排序

indexofsort=np.argsort(dataset[:,0],axis=-1,kind='stable') 
dataset   = dataset[indexofsort,:]