在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]