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