我如何排序一个NumPy数组的第n列?
例如,给定:
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想对a的行按第二列进行排序,得到:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
我如何排序一个NumPy数组的第n列?
例如,给定:
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想对a的行按第二列进行排序,得到:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
当前回答
这是一个老问题,但如果你需要将其推广到高于2维的数组,下面是可以很容易推广的解决方案:
np.einsum('ij->ij', a[a[:,1].argsort(),:])
对于二维来说,这是一个过度的处理,对于@steve的答案,一个[a[:,1].argsort()]就足够了,但是这个答案不能推广到更高的维度。你可以在这个问题中找到一个3D数组的例子。
输出:
[[7 0 5]
[9 2 3]
[4 5 6]]
其他回答
这里是另一个考虑所有列的解决方案(J.J的答案更紧凑的方式);
ar=np.array([[0, 0, 0, 1],
[1, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 1],
[0, 0, 1, 0],
[1, 1, 0, 0]])
用lexsort排序,
ar[np.lexsort(([ar[:, i] for i in range(ar.shape[1]-1, -1, -1)]))]
输出:
array([[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 1],
[1, 0, 1, 0],
[1, 1, 0, 0]])
正如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]]]
从NumPy邮件列表中,这里有另一个解决方案:
>>> a
array([[1, 2],
[0, 0],
[1, 0],
[0, 2],
[2, 1],
[1, 0],
[1, 0],
[0, 0],
[1, 0],
[2, 2]])
>>> a[np.lexsort(np.fliplr(a).T)]
array([[0, 0],
[0, 0],
[0, 2],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 2],
[2, 1],
[2, 2]])
熊猫的方法只是为了完整性:
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
简单地使用排序,使用您想要排序的列号。
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)