【问题标题】:How to implement pd.sort_values(ascending=False) with np.argsort?如何用 np.argsort 实现 pd.sort_values(ascending=False)?
【发布时间】:2022-11-13 01:41:08
【问题描述】:

我有一个数组,我需要它的索引,它会对它进行排序。之前的实现在我想重构的循环中使用了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(list(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 ]

【问题讨论】:

  • argsort 做任何特别的事情的关键是用你想要排序的值创建一个数组。如果您想要反向排序,则需要反转参数(甚至可能否定值)。

标签: python arrays pandas numpy matrix


【解决方案1】:

必须先还原数组,然后更正索引:

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]

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多