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

例如,给定:

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

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

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

当前回答

你可以按照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列排序。

其他回答

#用于按列1排序

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

@steve的回答实际上是最优雅的方式。

关于“正确”的方法,请参阅numpy.ndarray.sort的order关键字参数

但是,您需要将数组视为带有字段的数组(结构化数组)。

如果你一开始没有用字段定义数组,那么“正确”的方式是非常丑陋的……

举个简单的例子,排序并返回一个副本:

In [1]: import numpy as np

In [2]: a = np.array([[1,2,3],[4,5,6],[0,0,1]])

In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)
Out[3]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])

在适当的位置排序:

In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns None

In [7]: a
Out[7]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])

据我所知,史蒂夫的方法真的是最优雅的……

该方法的唯一优点是“order”参数是一个字段列表,用于排序搜索。例如,您可以通过order=['f1','f2','f0']按第二列排序,然后是第三列,然后是第一列。

感谢这篇文章:https://stackoverflow.com/a/5204280/13890678

我用结构化数组找到了一个更“通用”的答案。 我认为这种方法的一个优点是代码更容易阅读。

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

struct_a = np.core.records.fromarrays(
    a.transpose(), names="col1, col2, col3", formats="i8, i8, i8"
)
struct_a.sort(order="col2")

print(struct_a)
[(7, 0, 5) (9, 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]

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

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

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

输出:

[[7 0 5]
 [9 2 3]
 [4 5 6]]