You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为numpy.unique自定义排序规则并获取唯一值及对应索引?

解决方案

方法一:纯Python实现

不需要依赖numpy,直接通过集合去重、自定义排序+字典映射就能搞定:

R = ["ip1", "ip7", "ip12", "ip5", "ip2", "ip22", "ip7", "ip1", "ip17", "ip22"]

# 获取唯一值并按IP后缀数字排序
unique_sorted = sorted(set(R), key=lambda x: int(x[2:]))
# 创建值到索引的映射字典
val_to_idx = {val: idx for idx, val in enumerate(unique_sorted)}
# 生成原列表对应的索引数组
idx = [val_to_idx[val] for val in R]

print("排序后的唯一值:", unique_sorted)
print("原列表对应索引:", idx)

输出结果:

排序后的唯一值: ['ip1', 'ip2', 'ip5', 'ip7', 'ip12', 'ip17', 'ip22']
原列表对应索引: [0, 3, 4, 2, 1, 6, 3, 0, 5, 6]

方法二:结合numpy实现

如果你习惯用numpy,可以在去重后自定义排序,再生成索引映射:

import numpy as np

R = ["ip1", "ip7", "ip12", "ip5", "ip2", "ip22", "ip7", "ip1", "ip17", "ip22"]
R_np = np.array(R)

# 先获取默认唯一值
unique_vals = np.unique(R_np)
# 按IP后缀数字排序唯一值
unique_sorted = sorted(unique_vals, key=lambda x: int(x[2:]))
# 创建映射字典
val_idx_map = {v:i for i, v in enumerate(unique_sorted)}
# 生成numpy格式的索引数组
idx = np.array([val_idx_map[v] for v in R_np])

print("排序后的唯一值:", unique_sorted)
print("原列表对应索引:", idx)

说明

np.unique本身没有提供自定义排序键的参数,它的排序逻辑是基于元素本身的默认比较规则(字符串按字典序)。所以最佳方案是先去重,再对唯一值做自定义排序,最后通过字典映射生成原列表的索引数组,这样既满足排序需求,又能得到类似return_inverse的结果。

内容的提问来源于stack exchange,提问作者farid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:33:18