我如何排序一个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
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]

其他回答

@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']按第二列排序,然后是第三列,然后是第一列。

我也遇到过类似的问题。

我的问题:

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

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

我的解决方案

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

那么这是如何工作的呢?

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

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

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

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

#用于按列1排序

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

按a的第二列排序:

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

感谢这篇文章: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)]