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

例如,给定:

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

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

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

当前回答

如果有人想在程序的关键部分使用排序,这里是不同方案的性能比较:

import numpy as np
table = np.random.rand(5000, 10)

%timeit table.view('f8,f8,f8,f8,f8,f8,f8,f8,f8,f8').sort(order=['f9'], axis=0)
1000 loops, best of 3: 1.88 ms per loop

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

import pandas as pd
df = pd.DataFrame(table)
%timeit df.sort_values(9, ascending=True)
1000 loops, best of 3: 400 µs per loop

所以,看起来使用argsort进行索引是目前为止最快的方法…

其他回答

按a的第二列排序:

a[a[:, 1].argsort()]

我也遇到过类似的问题。

我的问题:

我想计算SVD,并需要对特征值进行降序排序。但是我想保持特征值和特征向量之间的映射。 我的特征值在第一行对应的特征向量在它下面的同列。

我想对一个二维数组按第一行降序按列排序。

我的解决方案

a = a[::, a[0,].argsort()[::-1]]

那么这是如何工作的呢?

a[0,]是我要排序的第一行。

现在我使用argsort来获取下标的顺序。

我使用[::-1]是因为我需要降序。

最后我使用了一个[::,…]以获得按正确顺序排列的视图。

你可以按照Steve Tjoa的方法对多个列进行排序,使用像归并排序这样的稳定排序,并从最不重要的列到最重要的列对索引进行排序:

a = a[a[:,2].argsort()] # First sort doesn't need to be stable.
a = a[a[:,1].argsort(kind='mergesort')]
a = a[a[:,0].argsort(kind='mergesort')]

这是按第0列,第1列,第2列排序。

正如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]]]
import numpy as np
a=np.array([[21,20,19,18,17],[16,15,14,13,12],[11,10,9,8,7],[6,5,4,3,2]])
y=np.argsort(a[:,2],kind='mergesort')# a[:,2]=[19,14,9,4]
a=a[y]
print(a)

期望的输出是[[6、5、4、3、2],[11、10、9、8、7]、[12]16日,15日,14日,13日,[17]19日21日20日,18日)

请注意,argsort(numArray)返回numArray的索引,因为它应该以排序的方式排列。

例子

x=np.array([8,1,5]) 
z=np.argsort(x) #[1,3,0] are the **indices of the predicted sorted array**
print(x[z]) #boolean indexing which sorts the array on basis of indices saved in z

答案是[1,5,8]