在python中使用argsort排序

use*_*912 4 python numpy python-2.7

我尝试对数组进行排序:

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
Run Code Online (Sandbox Code Playgroud)

但输出是:

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]
Run Code Online (Sandbox Code Playgroud)

阵列根本不会改变

Ter*_*ryA 19

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

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

new_arr = np.argsort(arr)
Run Code Online (Sandbox Code Playgroud)

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

np.array(arr)[new_arr]
Run Code Online (Sandbox Code Playgroud)


Phi*_*per 7

尝试

order = np.argsort(arr)
print np.array(arr)[order]
Run Code Online (Sandbox Code Playgroud)

所述argsort响应是元素的索引.


ask*_*han 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])
Run Code Online (Sandbox Code Playgroud)

在上面,[3, 1, 0, ...]意味着3原始列表中的项应该首先(the 2),然后项2应该来(the 3),然后是第一个(index是0,item是5),依此类推.请注意,arr仍然不受影响:

In [61]: arr
Out[61]: [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]
Run Code Online (Sandbox Code Playgroud)

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

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

但这仍然是arr孤立的:

In [68]: arr
Out[68]: [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]
Run Code Online (Sandbox Code Playgroud)

如果您想要就地(修改原件),请使用:

In [69]: arr.sort()

In [70]: arr
Out[70]: [2, 3, 5, 5, 6, 7, 22, 32, 34, 46, 344, 545]
Run Code Online (Sandbox Code Playgroud)

  • 就像一个注释,`np.sort(arr)`返回已排序数组的副本,而不是就地排序 (4认同)