295 python arrays sorting numpy scipy
如何在第n列中对NumPy中的数组进行排序?
例如,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
Run Code Online (Sandbox Code Playgroud)
我想按第二列对行进行排序,以便我回来:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
Run Code Online (Sandbox Code Playgroud)
Ste*_*joa 657
我认为这有效: a[a[:,1].argsort()]
这表示第二列,a并根据它进行排序.
Joe*_*ton 125
@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]])
Run Code Online (Sandbox Code Playgroud)
要就地排序:
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]])
Run Code Online (Sandbox Code Playgroud)
据我所知,@ Steve真的是最优雅的做法...
此方法的唯一优点是"order"参数是用于对搜索进行排序的字段列表.例如,您可以按第二列,然后是第三列,然后通过提供order = ['f1','f2','f0']排序第一列.
J.J*_*J.J 28
您可以按照Steve Tjoa的方法对多个列进行排序,方法是使用类似mergesort的稳定排序,并将索引从最不重要的列排序到最重要的列:
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')]
Run Code Online (Sandbox Code Playgroud)
这按列0排序,然后是1,然后是2.
小智 19
从Python文档维基,我认为你可以做到:
a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]);
a = sorted(a, key=lambda a_entry: a_entry[1])
print a
Run Code Online (Sandbox Code Playgroud)
输出是:
[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]
Run Code Online (Sandbox Code Playgroud)
prl*_*900 17
如果有人想在其程序的关键部分使用排序,则可以对不同的建议进行性能比较:
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
Run Code Online (Sandbox Code Playgroud)
因此,看起来使用argsort进行索引是迄今为止最快的方法...
fgr*_*egg 16
从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]])
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题。
我的问题:
我想计算一个 SVD 并且需要按降序对我的特征值进行排序。但我想保留特征值和特征向量之间的映射。我的特征值在第一行,对应的特征向量在它下面的同一列中。
所以我想按降序按第一行对二维数组进行列排序。
我的解决方案
a = a[::, a[0,].argsort()[::-1]]
Run Code Online (Sandbox Code Playgroud)
那么这是如何工作的呢?
a[0,] 只是我想排序的第一行。
现在我使用 argsort 来获取索引的顺序。
我使用[::-1]是因为我需要降序。
最后,我使用a[::, ...]以正确顺序获取列的视图。