python - NumPy - 任何 dtype 的降序稳定 arg-sort 数组
问题描述
NumPy 的np.argsort能够通过传递参数进行稳定排序。kind = 'stable'
也不np.argsort
支持反向(降序)顺序。
如果需要不稳定的行为,则可以通过 轻松建模降序desc_ix = np.argsort(a)[::-1]
。
我正在寻找有效/简单的解决方案来降序稳定排序 NumPy 的a
任何可比数组dtype
。请参阅最后一段中我对“稳定性”的含义。
对于任何数值的情况,dtype
可以通过对数组的否定版本进行排序来轻松完成稳定的降序 arg 排序:
print(np.argsort(-np.array([1, 2, 2, 3, 3, 3]), kind = 'stable'))
# prints: array([3, 4, 5, 1, 2, 0], dtype=int64)
但我需要支持任何可比的,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]
解决方案
我认为这个公式应该有效:
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]
推荐阅读
- puppet - 如何在epp中打印带引号的数组?
- docker - VSCode docker 连接到自托管 GitLab
- scala - 遇到错误时,我可以让 Akka HTTP 背压吗?
- c# - 集成测试 multipart/form-data c#
- sql - 有没有办法在 postgres 中创建具有值的 CTE?
- r - 如何根据具有名称类型的变量在 R 中过滤和计数
- node.js - Jenkins 中的 Puppeteer 在没有 Root 权限的情况下使用 EC2 Linux
- c# - 获取错误的屏幕尺寸(C#/ Winforms)
- java - 为什么在 Java 的 Tensorflow 中出现“维度 0 的切片索引 0 越界”错误?
- c++ - 无法将景观 LayerInfo 对象分配给景观