python降序排序_python-按列在NumPy中对数组进⾏排序python - 按列在NumPy中对数组进⾏排序
如何在第n列中对NumPy中的数组进⾏排序?
例如,
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想按第⼆列对⾏进⾏排序,以便我回来:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
9个解决⽅案
512 votes
我想这是有效的:a[a[:,1].argsort()]
Steve Tjoa answered 2019-03-05T19:26:03Z
91 votes
@ steve's实际上是最优雅的做法。
对于“正确”⽅式,请参阅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],
据我所知,@ Steve真的是最优雅的做法...
此⽅法的唯⼀优点是“order”参数是⽤于对搜索进⾏排序的字段列表。 例如,您可以按第⼆列,然后是第三列,然后通过提供order = ['f1','f2','f0']排序第⼀列。
Joe Kington answered 2019-03-05T19:25:39Z
20 votes
您可以按照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')]
这按列0排序,然后是1,然后是2。
J.J answered 2019-03-05T19:26:33Z
17 votes
从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]]]
user541064 answered 2019-03-05T19:26:58Z
13 votes
如果有⼈想在其程序的关键部分使⽤排序,则可以对不同的建议进⾏性能⽐较:
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进⾏索引是迄今为⽌最快的⽅法...
MonkeyButter answered 2019-03-05T19:27:29Z
从NumPy邮件列表中,这是另⼀个解决⽅案:
>>> a
array([[1, 2],
[0, 0],
python 定义数组[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]])
fgregg answered 2019-03-05T19:27:53Z
3 votes
我遇到了类似的问题。
我的问题:
我想计算⼀个SVD,需要按降序对我的特征值进⾏排序。 但我想保持特征值和特征向量之间的映射。我的特征值在第⼀⾏,⽽在它下⾯的相应特征向量在同⼀列中。
所以我想按第⼀⾏按降序排列⼀个⼆维数组。
我的解决⽅案
a = a[::, a[0,].argsort()[::-1]]
那么这是如何⼯作的呢?
a[::, ...]只是我要排序的第⼀⾏。
现在我使⽤argsort来获取索引的顺序。
我使⽤a[::, ...],因为我需要降序。
最后,我使⽤a[::, ...]以正确的顺序获取列的视图。
xuma202 answered 2019-03-05T19:29:09Z
1 votes
稍微复杂⼀点的lexsort⽰例 - 在第1列下降,在第2列上下降。 lexsort的技巧是对⾏进⾏排序(因此为.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]])
hpaulj answered 2019-03-05T19:29:34Z
0 votes
这是考虑所有专栏的另⼀种解决⽅案(J.J的答案更简洁的⽅式);
ar=np.array([[0, 0, 0, 1],
[1, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 1],
[0, 0, 1, 0],
[1, 1, 0, 0]])
⽤lexsort排序,
ar[np.lexsort(([ar[:, i] for i in range(ar.shape[1]-1, -1, -1)]))]输出:
array([[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 1],
[1, 0, 1, 0],
[1, 1, 0, 0]])
Sefa answered 2019-03-05T19:30:06Z
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论