在python中使用argsort进行排序

在python中使用argsort进行排序,python,python-2.7,numpy,Python,Python 2.7,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,

我尝试对数组进行排序:

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]

数组根本不会更改。argsort不会对列表进行适当排序,它会返回一个满是标记的列表,您可以使用这些标记对列表进行排序

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

new_arr = np.argsort(arr)
然后,要使用这些索引对列表进行排序,可以执行以下操作:

np.array(arr)[new_arr]
试一试


响应是元素的索引

如果希望数组在适当的位置排序,则需要
arr.sort()


这里有两个问题,;一个是
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),然后是
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 [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]
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]
如果要就地执行(修改原始文件),请使用:


这些东西可以在1分钟内在文档中搜索:1。它返回已排序元素的索引。2.它不就地执行,但返回新数组。使用
arr.sort()
进行就地排序。我想您的意思是
index=np.argsort(arr);arr[索引]
。请注意,
argsort
不是
sort
@askewchan,它只是一个名称。OP可以随意命名:)是的,对不起,我指的是你的第一句话,“np.argsort没有对列表进行排序,它返回一个排序列表”,它返回将对列表进行排序的索引。看看OP示例返回的内容:
数组([3,1,0,10,4,2,11,9,5,6,7,8])
,我不会称之为排序的。@askewchan谢谢。我从来没有完全使用过
numpy
,因此我将编辑我的回答,就像一个注释一样,
np.sort(arr)
返回排序数组的副本,而不是按顺序排序-place@Josh是的,这就是
arr.sort()
的目的,因为
np.sort(arr)
只剩下
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]