在python中使用argsort排序

时间:2013-11-06 04:24:32

标签: python numpy

我尝试对数组进行排序:

import numpy as np

arr = [5,3,7,2,6,34,46,344,545,32,5,22]
print "unsorted"
print arr

np.argsort(arr)

print "sorted"
print arr

但输出是:

unsorted
[5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]
sorted
[5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

阵列根本不会改变

4 个答案:

答案 0 :(得分:17)

np.argsort不会对列表进行排序,它会返回一个列表,其中包含您可以用来对列表进行排序的指示。

您必须将此返回的列表分配给值:

new_arr = np.argsort(arr)

然后,要使用这些索引对列表进行排序,您可以执行以下操作:

np.array(arr)[new_arr]

答案 1 :(得分:7)

这里有两个问题;一个是np.argsort返回一个 indices 的数组,它会对原始数组进行排序,第二个是它不会修改原始数组,只是给你另一个。这个互动会议应该有助于解释:

In [59]: arr = [5,3,7,2,6,34,46,344,545,32,5,22]

In [60]: np.argsort(arr)
Out[60]: array([ 3,  1,  0, 10,  4,  2, 11,  9,  5,  6,  7,  8])

在上方,[3, 1, 0, ...]表示原始列表中的项3应首先出现(2),然后出现项23 }),然后第一个(索引是0,项目是5),依此类推。请注意,arr仍然不受影响:

In [61]: arr
Out[61]: [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

您可能不需要这个索引数组,并且会发现使用np.sort更容易:

In [62]: np.sort(arr)
Out[62]: array([  2,   3,   5,   5,   6,   7,  22,  32,  34,  46, 344, 545])

但这仍然只留下arr

In [68]: arr
Out[68]: [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

如果您想这样做(修改原件),请使用:

In [69]: arr.sort()

In [70]: arr
Out[70]: [2, 3, 5, 5, 6, 7, 22, 32, 34, 46, 344, 545]

答案 2 :(得分:5)

尝试

order = np.argsort(arr)
print np.array(arr)[order]

argsort响应是元素的索引。

答案 3 :(得分:2)

如果您希望阵列就地排序,则需要arr.sort()

In [1]: import numpy as np  
In [2]: arr = [5,3,7,2,6,34,46,344,545,32,5,22]

In [4]: print arr
[5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

In [5]: arr.sort()
In [7]: print arr
[2, 3, 5, 5, 6, 7, 22, 32, 34, 46, 344, 545]