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

如何用Numpy高效映射数组值为按出现次数排序的唯一连续值

优化方案:高效Numpy实现+按出现次数排序

问题分析

你当前的代码通过循环遍历唯一值并替换,虽能实现功能,但时间复杂度为O(k*n)(k为唯一值数量,n为数组长度),数据量较大时效率偏低。同时默认按值排序的连续整数无法突出高频聚类,我们需要改为按出现次数排序的连续整数映射。

高效实现代码

import numpy as np

def normalize_by_count(Y):
    # 获取唯一值、对应出现次数,以及原数组的逆索引(每个元素对应唯一值的下标)
    unique_vals, counts, inverse = np.unique(Y, return_counts=True, return_inverse=True)
    
    # 按出现次数降序排序,得到唯一值的排序下标
    sorted_indices = np.argsort(-counts)
    
    # 创建映射表:将原唯一值的下标映射为新的连续整数(次数越多,索引值越小)
    rank_map = np.zeros_like(sorted_indices)
    rank_map[sorted_indices] = np.arange(len(sorted_indices))
    
    # 通过逆索引得到最终的连续整数数组
    return rank_map[inverse]

代码说明

  1. 高效性:全程使用Numpy向量操作,避免Python循环,时间复杂度优化为O(n log k)(仅np.unique的排序步骤有对数复杂度),处理大规模数据时性能提升明显。
  2. 按次数排序:通过np.argsort(-counts)实现按出现次数降序排列,出现次数最多的类别会被映射为0,其次为1,以此类推,让高频聚类在颜色映射中更突出。
  3. 无副作用:返回新数组而非修改原输入,避免意外修改原始数据。

对比示例

假设输入Y = np.array([3, 1, 2, 1, 3, 3, 5]):

  • 原代码输出:[1, 0, 2, 0, 1, 1, 3](按值排序的索引)
  • 新代码输出:[0, 1, 2, 1, 0, 0, 3](3出现3次→0,1出现2次→1,2和5各1次→2、3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:45:32