如何确保一维数组中每个唯一标签计数≥指定值?附合并方案
高效小样本标签合并方案优化
我有一个从0开始标记的一维标签数组,目标是确保每个唯一标签的计数≥指定常量(如10)。若不满足,则将其与邻近标签合并,直到计数达标。
示例数据
import random import numpy as np data = np.concatenate(([0]*5, [1]*10, [2]*15, [3]*10, [4]*12, [5]*5)) random.Random(4).shuffle(data) print(data)
输出结果:
array([2, 3, 4, 5, 2, 4, 2, 4, 2, 2, 0, 4, 1, 4, 4, 5, 4, 2, 1, 3, 1, 1, 5, 0, 3, 3, 2, 2, 4, 4, 3, 3, 4, 4, 1, 2, 5, 1, 2, 2, 3, 3, 1, 0, 2, 3, 5, 0, 0, 1, 1, 3, 2, 4, 1, 2, 2])
合并逻辑
从标签0开始,其计数为5(<10),将标签1合并到0(把1替换为0),此时标签0计数达标(15);后续标签2计数达标,继续处理;最后标签5计数不足,将其替换为4。
现有实现及问题
目前通过遍历np.unique(data)并使用np.bincount(data)统计计数的方法实现,但在数据量较大时速度较慢,现有代码如下:
import random data = np.concatenate(([0]*5, [1]*10, [2]*15, [3]*10, [4]*12, [5]*5)) random.Random(4).shuffle(data) counts = np.bincount(data) new_label = 0 count_num = 0 for label in np.unique(data): if count_num > 0: data[data==label] = label-1 count_num += counts[label] if count_num >= 10: count_num = 0 if label == np.unique(data)[-1] and counts[label] < 10: data[data==label] = label-1
处理后输出:
array([2, 3, 4, 4, 2, 4, 2, 4, 2, 2, 0, 4, 0, 4, 4, 4, 4, 2, 0, 3, 0, 0, 4, 0, 3, 3, 2, 2, 4, 4, 3, 3, 4, 4, 0, 2, 4, 0, 2, 2, 3, 3, 0, 0, 2, 3, 4, 0, 0, 0, 0, 3, 2, 4, 0, 2, 2])
请问有什么更高效的标签合并方案?
内容的提问来源于stack exchange,提问作者zxdawn
相关产品推荐
相关产品推荐

