NumPy-任何dtype数组的降序稳定arg-sort

问题描述

NumPy的np.argsort可以通过传递function getAllTimeZones(){ $selectOptions = ""; foreach(\DateTimeZone::listIdentifiers() as $zoneLabel) { $currentTimeInZone = new \DateTime("Now",new \DateTimeZone($zoneLabel)); $currentTimeDiff = $currentTimeInZone->format('P'); $selectOptions .= "<option value=\"$zoneLabel\">(GMT $currentTimeDiff) $zoneLabel</option>\n"; } return $selectOptions; } 参数来完成stable sorting

kind = 'stable'不支持倒序(降序)。

如果需要不稳定的行为,则可以通过np.argsort轻松地对降序建模。

我正在寻找一种高效/简便的解决方案,以解决任何可比较的desc_ix = np.argsort(a)[::-1]的降序稳定NumPy数组a。在最后一段中看到我的“稳定性”的意思。

对于dtype是任何数字的情况,可以通过对数组求反的形式轻松地进行稳定的arg降序排序:

dtype

但是我需要支持任何可比较的print(np.argsort(-np.array([1,2,3,3]),kind = 'stable')) # prints: array([3,4,5,1,0],dtype=int64) 包括dtypenp.str_

仅出于说明目的-也许是降序排列,np.object_的经典含义表示从右到左枚举相等的元素。如果是这样,那么在我的问题中stable的含义有所不同-元素的相等范围应从左到右枚举,而彼此之间的相等范围按降序排列。即应该像上面的最后一个代码一样实现相同的行为。即我想要稳定性,就像Python在下一个代码中实现的一样:

stable + descending

解决方法

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

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

我们可以利用np.unique(...,return_inverse=True)-

u,tags = np.unique(a,return_inverse=True)
out = np.argsort(-tags,kind='stable')
,

一种最简单的解决方案是将任何dtype的排序后的唯一元素映射到升序整数,然后对负整数进行稳定的arg升序排序。

Try it online!

import numpy as np
a = np.array(['a','b','c','c'])
u = np.unique(a)
i = np.searchsorted(u,a)
desc_ix = np.argsort(-i,kind = 'stable')
print(desc_ix)
# prints [3 4 5 1 2 0]