按列sortingNumPy中的数组

我怎样才能sorting在NumPy第n列数组?

例如,

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

我想在第二列中sorting行,这样我就回来了:

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

实际上, @steve是最优雅的做法。

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

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

如果你最初没有用字段定义你的数组,那么“正确的”方法是相当难看的…

作为一个简单的例子,对它进行sorting并返回一个副本:

 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]]) 

要在原地sorting:

 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”参数是一个用于sortingsearch的字段列表。 例如,您可以通过提供order = ['f1','f2','f0']来sorting第二列,第三列和第一列。

我想这个工程: a[a[:,1].argsort()]

从Python文档维基 ,我认为你可以这样做:

 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]]] 

按照Steve Tjoa的方法,可以使用像mergesort这样的稳定​​sorting,并对从最低有效位到最高有效位的列进行sorting:

 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')] 

这sorting0列,然后1,然后2。

从NumPy邮件列表 ,这是另一个解决scheme:

 >>> 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]]) 

如果有人想在他们的计划的关键部分使用sorting,这里是不同的build议的性能比较:

 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索引是迄今为止最快的方法…

我有一个类似的问题。

我的问题:

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

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

我的解决scheme

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

那么这是如何工作的?

a[0,]只是我想sorting的第一行。

现在我使用argsort来获取索引的顺序。

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

最后,我使用a[::, ...]以正确的顺序得到一个视图。

一个更复杂的例子 – 第一列下降,第二列上升。 使用lexsort的技巧是,它sorting在行(因此.T ),并优先于最后。

 In [120]: b=np.array([[1,2,1],[3,1,2],[1,1,3],[2,3,4],[3,2,5],[2,1,6]]) In [121]: b Out[121]: array([[1, 2, 1], [3, 1, 2], [1, 1, 3], [2, 3, 4], [3, 2, 5], [2, 1, 6]]) In [122]: b[np.lexsort(([1,-1]*b[:,[1,0]]).T)] Out[122]: array([[3, 1, 2], [3, 2, 5], [2, 1, 6], [2, 3, 4], [1, 1, 3], [1, 2, 1]])