numpy 如何使用np.argsort实现pd.sort_values(升序=False)?

oymdgrw7  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(151)

我有一个数组,我需要它的索引来排序它。之前的实现在循环中使用了pd.sort_values(),我想重构它。为此,我需要用argsort来实现它。
下面是我的尝试:

array = np.array([1.,  2.,  0.,  0.,  9.,  3.,  7., 13.,  4.,  5., 15.,  5., 12.,  6.,  3.,
              1.,  1.,  5.,  1.,  9., 15.,  2.,  4.,  7., 16.,  7.,  8., 11., 15., 13.,  4., 16., 11.])

# Just for illustration of what I need as output
print(list(pd.Series(array).sort_values(ascending=False, kind="quicksort").index)) 
# Out: [31, 24, 20, 28, 10, 7, 29, 12, 32, 27, 4, 19, 26, 6, 23, 25, 13, 11, 9, 17, 8, 22, 30, 14, 5, 1, 21, 0, 18, 15, 16, 3, 2]

# I tried: 
print(array.argsort(kind="quicksort")[::-1])
print((-array).argsort(kind='quicksort'))
print(array.argsort(kind='quicksort')[-len(array):][::-1])
# Out: [24 31 20 28 10 29 7 12 32 27 4 19 26 25 6 23 13 9 17 11 8 30 22 14 5 21 1 0 15 18 16 3 2 ]
guykilcj

guykilcj1#

必须先恢复数组,然后再更正索引:

array = np.array([1.,  2.,  0.,  0.,  9.,  3.,  7., 13.,  4.,  5., 15.,  5., 12.,  6.,  3.,
              1.,  1.,  5.,  1.,  9., 15.,  2.,  4.,  7., 16.,  7.,  8., 11., 15., 13.,  4., 16., 11.])
N = len(array)
print(list(np.abs(array[::-1].argsort(kind="quicksort")-(N-1)))[::-1])
# Out: [31, 24, 20, 28, 10, 7, 29, 12, 32, 27, 4, 19, 26, 6, 23, 25, 13, 11, 9, 17, 8, 22, 30, 14, 5, 1, 21, 0, 18, 15, 16, 3, 2]

相关问题