在Python中使用argsort进行排序

6

我尝试对一个数组进行排序:

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]

数组不会发生任何变化


5
这些东西可以在文档中1分钟内搜索到:http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html 1. 它返回已排序元素的索引。2. 它不是原地进行排序,而是返回新数组。 - sashkello
1
使用 arr.sort() 进行原地排序。 - Bi Rico
4个回答

25

np.argsort不会就地对列表进行排序,它会返回一个包含索引的完整列表,您可以使用这些索引来对列表进行排序。

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

new_arr = np.argsort(arr)

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

np.array(arr)[new_arr]

我认为你的意思是 indices = np.argsort(arr); arr[indices]。请注意,argsort 不是 sort - askewchan
1
@askewchan 这只是一个名称。OP可以随意命名它 :) - TerryA
对不起,我的意思是你的第一句话,“np.argsort不会就地排序列表,它返回一个已排序的列表”。它返回将列表排序的索引。看看OP示例返回的内容:array([ 3, 1, 0, 10, 4, 2, 11, 9, 5, 6, 7, 8]),我不会称之为已排序。 - askewchan
@askewchan 谢谢。我从未完全使用过 numpy,所以我会编辑我的答案。 - TerryA

8

请尝试

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

argsort响应是元素的索引。


7

这里有两个问题;一个是np.argsort返回的是一个索引数组,可以用来对原始数组进行排序;第二个是它不会修改原始数组,而只是提供另一个数组。下面的交互会话应该可以帮助解释:

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),然后应该出现第二项(即 3),然后是第一项(索引为 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]

4
请注意,np.sort(arr) 返回已排序数组的副本,而不是原地排序。 - JoshAdel
@JoshпјҢжІЎй”ҷпјҢиҝҷе°ұжҳҜarr.sort()зҡ„дҪңз”ЁпјҢеӣ дёәnp.sort(arr)дёҚдјҡж”№еҸҳarrжң¬иә«гҖӮ - askewchan

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接