NumPy - 任何 dtype 数组的降序稳定参数排序

Art*_*oul 3 python arrays sorting numpy stable-sort

NumPy 的np.argsort能够通过传递参数进行稳定排序kind = 'stable'

也不np.argsort支持反向(降序)顺序。

如果需要不稳定行为,则可以通过 轻松建模降序desc_ix = np.argsort(a)[::-1]

我正在寻找高效/简单的解决方案来降序稳定排序 NumPy 的a任何可比较的数组dtype。请参阅我在上一段中对“稳定性”的含义。

对于任何数值的情况,dtype可以通过对数组的否定版本进行排序来轻松完成稳定的降序参数排序:

print(np.argsort(-np.array([1, 2, 2, 3, 3, 3]), kind = 'stable'))
# prints: array([3, 4, 5, 1, 2, 0], dtype=int64)
Run Code Online (Sandbox Code Playgroud)

但我需要支持任何类似的,dtype包括np.str_np.object_

只是为了澄清 - 也许对于降序排列的经典含义stable意味着相等的元素是从右到左枚举的。如果是这样,那么在我的问题中,含义stable + descending有所不同 - 元素的相等范围应该从左到右枚举,而彼此之间的相等范围按降序排列。即应该像上面的最后一个代码一样实现相同的行为。也就是说,我想要某种意义上的稳定性,就像 Python 在下一个代码中实现的那样:

print([e[0] for e in sorted(enumerate([1,2,2,3,3,3]), key = lambda e: e[1], reverse = True)])
# prints: [3, 4, 5, 1, 2, 0]
Run Code Online (Sandbox Code Playgroud)

jde*_*esa 5

我认为这个公式应该有效:

import numpy as np
a = np.array([1, 2, 2, 3, 3, 3])
s = len(a) - 1 - np.argsort(a[::-1], kind='stable')[::-1]
print(s)
# [3 4 5 1 2 0]
Run Code Online (Sandbox Code Playgroud)