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

