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

如何从分组列表中生成无重复的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:48:20