如何为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
相关产品推荐
相关产品推荐

