我有一个要用不同参数组合评估的函数,例如
params1 = [1, 6, 100]
params2 = [True, False]
params3 = ["blue", "red", "green"]
这是我这样做的直接尝试:
res = np.zeros((len(params1), len(params2), len(params3)))
for i1, p1 in enumerate(params1):
for i2, p2 in enumerate(params2):
for i3, p3 in enumerate(params3):
res[i1, i2, i3] = myfunc(p1,p2,p3)
这是可行的,但是使其适应更复杂的场景不仅麻烦,而且更重要的是使代码混乱,从而增加了出错的机会。
下一个以更结构化的方式处理此问题的方法是编写一个递归函数,该函数将在一个参数中启动一个for循环,然后在此循环调用本身内部。
但是由于我的问题似乎是一个非常普遍的问题,所以我想知道是否有更好的方法(例如更基本或更整洁)来解决这个问题。
编辑:感谢您的有用评论。建议使用
for params in itertools.product(params1, params2, params3): myfunc(*params)
。
不幸的是,这对我没有帮助,因为我还需要索引。因为缺少了这一关键部分,所以我编辑了代码。
我还应该提供关于此功能的更多背景知识,因为这对我来说似乎是一个标准问题,可能会有完全不同的方法:
我想在高维参数空间的某个部分中评估myfunc
的数值输出,以便稍后进行探索,尤其是在约束下寻找最大值和最小值(例如parameter2 = True
的最小值)。因此,我的方法是在该空间的那一部分进行评估,并将结果存储在numpy数组res
中。
再次感谢您的任何建议。