如何用索引作为哈希函数高效生成参数随机组合
解决方案
问题1:无放回生成10000个随机索引
你用np.random.choice报错的核心原因是:当传入第一个参数为大整数15**13时,numpy会先生成一个长度为15**13的连续整数数组作为采样池,这个数组大小远超内存上限,必然报错。
由于你需要的采样量仅10000,远小于总组合数15**13≈1.9e15,直接用「随机生成+去重补集」的方案即可,完全不会有内存压力:
import random total_combinations = 15 ** 13 sample_count = 10000 sample_indices = set() # 循环生成直到凑够无重复的10000个索引 while len(sample_indices) < sample_count: idx = random.randrange(total_combinations) sample_indices.add(idx) # 转成列表方便后续遍历 sample_indices = list(sample_indices)
这个方案的重复碰撞概率不足亿分之一,即使偶有重复也会被set自动去重,循环补充即可。
问题2:索引直接转参数组合
itertools.product生成组合的顺序本质是基数为步长数的进制计数逻辑:最右侧的迭代器每次先变化,对应进制的最低位。我们可以直接把索引转换为15进制的数位,每个数位对应变量在np.linspace序列中的下标,不需要枚举所有组合:
import numpy as np def idx_to_params(idx, val_keys, val_arrays, step_num=15): param_dict = {} current = idx # 反转变量顺序,对应product从右往左变化的逻辑 for key, arr in zip(reversed(val_keys), reversed(val_arrays)): current, pos = divmod(current, step_num) param_dict[key] = arr[pos] return param_dict # 预处理阶段:先生成每个变量的linspace序列,不需要生成组合 # 你的原始val_dict示例:val_dict_input = {'A': [50, 100], 'B': [10, 40], ...} val_dict = {k: np.linspace(*v, 15) for k, v in val_dict_input.items()} val_keys = list(val_dict.keys()) val_arrays = list(val_dict.values()) # 遍历采样到的索引直接生成参数 for idx in sample_indices: param_dict = idx_to_params(idx, val_keys, val_arrays) # 你的原逻辑i从1开始计数,所以索引+1即可 self.write(idx + 1, param_dict)
注意:Python 3.7及以上版本字典默认保留插入顺序,如果你用更低版本,建议用
collections.OrderedDict存储val_dict,保证变量顺序和索引转换的对应关系一致。
内容的提问来源于stack exchange,提问作者Osman Mamun
相关产品推荐
相关产品推荐

