如何从分组列表中生成无重复的C1/C2组随机样本对?
解决方案:生成指定数量的不重复分组样本对
核心思路
先将原列表按分组拆分,再通过数学映射生成不重复的随机样本对,避免低效的重复筛选和内存浪费。
步骤详解
1. 预处理分组
先把原列表中的元素按C1、C2分组,仅需执行一次,后续操作直接调用分组后的列表:
# 拆分C1和C2组 c1_items = [] c2_items = [] for item in my_list: if item[1] == 'C1': c1_items.append(item) elif item[1] == 'C2': c2_items.append(item) # 提前判断分组是否为空 if not c1_items or not c2_items: print("C1或C2组为空,无法生成样本对")
2. 验证生成可行性
计算所有可能的不重复样本对总数,如果总数小于8000万,直接提示无法满足需求:
c1_len = len(c1_items) c2_len = len(c2_items) total_possible = c1_len * c2_len target_count = 8000_0000 if total_possible < target_count: print(f"最多只能生成{total_possible}个不重复样本对,无法达到8000万次需求")
3. 生成不重复的样本对
利用random.sample()高效生成不重复的随机索引映射,避免存储所有可能的样本对:
import random # 生成8000万个不重复的随机数,每个数对应唯一的(C1索引, C2索引) selected_keys = random.sample(range(total_possible), target_count) # 将随机数转换为对应的元素对 result = [(c1_items[key // c2_len], c2_items[key % c2_len]) for key in selected_keys]
性能优化(可选)
如果需要更快的处理速度,可以用numpy替代纯Python循环:
import numpy as np # 转换为numpy数组加速计算 selected_keys_np = np.array(selected_keys) i_indices = selected_keys_np // c2_len j_indices = selected_keys_np % c2_len c1_np = np.array(c1_items) c2_np = np.array(c2_items) # 生成结果数组 result_np = np.column_stack((c1_np[i_indices], c2_np[j_indices])) # 如需转回Python列表 result = result_np.tolist()
关键说明
- 索引映射的优势:将每个(C1索引, C2索引)对映射成一个唯一整数,避免直接存储元组,大幅降低内存占用;同时
random.sample()处理range对象时无需生成所有可能的对,内存效率极高。 - 拒绝采样的局限性:如果直接用随机生成+去重,当接近总可能数时,冲突概率会急剧上升,效率极低,不适合大规模采样需求。
内容的提问来源于stack exchange,提问作者Viki
相关产品推荐
相关产品推荐

