【发布时间】:2017-06-06 19:01:43
【问题描述】:
我正在用 python 模拟进行实验,需要创建一个输入案例列表。
每个案例都是从参数列表中获取的一个实例,例如:
heights = [100,110,120]
alphas = [0.1,0.01,0.001]
C = [0.1,0.2,0.5,0.9]
B = [1,2]
列表列表是:
params = [heights,alphas,C,B]
原始数量更大(~30x100),因此直接处理每个列表效率不高。
最终每个输入案例都是每个类别的一个参数的元组/命名元组/字典,例如:
instance = {'height':100, 'alpha':0.1,'C:0.1, 'B':1}
我想迭代参数空间以创建实例列表 - 但这是关键:
我想迭代所有选项,而不是制作所有这些的笛卡尔积,而将其余类别设置为默认值(第一个)。例如:
params = [[1,2,3],[4,5][7,8]]
预期的实例集(没有重复)是:
[(1,4,7),(2,4,7),(3,4,7),(1,5,7)(1,4,8)]
其中 1 是第一个索引的默认值,4 是第二个索引的默认值,7 是第三个索引的默认值。
使用itertools 制作笛卡尔积非常容易:
from itertools import product
params = [[1,2,3],[4,5],[7,8]]
list(product(*params))
[(1, 4, 7), (1, 4, 8), (1, 5, 7), (1, 5, 8), (2, 4, 7), (2, 4, 8 ), (2, 5, 7), (2, 5, 8), (3, 4, 7), (3, 4, 8), (3, 5, 7), (3, 5, 8)]
然后我可以过滤掉不必要的实例,但首先生成它们听起来效率低下。有没有什么优雅的方式来构建这个迭代?
【问题讨论】: