我尝试对数组进行排序:
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]
阵列根本不会改变
答案 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
),然后出现项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]
答案 2 :(得分:5)
答案 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]