繁体   English   中英

如何在python中为所有可能的参数组合编写递归函数

[英]How to write a recursion function for all the possible parameter combinations in python

我正在尝试编写一段代码来遍历python算法的所有可能参数组合。

import numpy as np
parameter={'alpha1':np.linspace(0.3,0.4,10),'alpha2':np.linspace(0.9,2,100),...'alpha5':np.linspace(5,10,100)}

问题是我无法编写5嵌套的for循环。谁能给出一个演示如何编写递归函数以给出所有可能参数组合的列表的演示吗? 谢谢

您可以使用itertools.product函数,该函数获取一个迭代器列表并创建其笛卡尔乘积的迭代器(请参阅文档 )。

在我的解决方案中,我将parameter字典中的值用作迭代器。 我遍历了每个键的选项乘积( for values_option in product(*parameter.values()) ),并使用原始键创建了一个新的字典)

from itertools import product
import numpy as np

parameter={'alpha1':np.linspace(0.3,0.4,10),'alpha2':np.linspace(0.9,2,100)}

def parameter_options(parameter):
    for values_option in product(*parameter.values()):
        yield dict(zip(parameter.keys(), values_option))

for opt in parameter_options(parameter):
    print opt

让我们一步一步地看一下:

parameter.values()

这给出了字典中每个键值的值列表。

例如,如果我们有dictionary = {a: (1, 2, 3), b: (4, 5, 6)} ,则使用dictionary.values()将返回[(1, 2, 3), (4, 5, 6)] 进行dictionary.keys()将得到['a', 'b']

注意 :Python 2和Python 3之间有区别-在Python 2中,这些方法( keys()values() )将返回普通列表,而在Python 3中,它们将返回特殊的迭代器。 这不应该改变解决方案。

product(*parameter.values())

我们使用星号“解压缩”列表。 简而言之, itertools.product接收任意数量的参数。 我们要使用所有values作为输入:

vals = parameter.values()
product(vals[0], vals[1], vals[2], ..., vals[len(vals)])

Python有一种简单的方法将列表作为输入传递给接收任意数量参数的函数。 最后一行与product(*vals)

for values_option in product(*parameter.values()):

我们遍历了parameter字典值的所有选项。

第一次迭代将为所有参数提供第一个选项。 第二个迭代将为除一个参数以外的所有参数提供第一个选项,该参数将具有第二个选项。 这一直持续到我们有了最后一个选项,其中每个参数都有其最后一个选项。

zip(parameter.keys(), values_option)

这将获取两个列表(包含键和可能的值),并从根本上转置它们。 它给出了一个长度相同的列表,其中包括成对的:第一个列表中的第一个元素和第二个列表中的第二个元素。 像这样:

keys = ['a', 'b', 'c', 'd']
vals = [1, 2, 3, 4]
zip(keys, vals) = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

dict(...)

现在,我们可以使用此压缩列表来创建字典。 这是发起命令的另一种方式

{'a': 1, 'b': 2, 'c': 3} == dict([('a', 1), ('b', 2), ('c', 3)])

yield ...

这就是我们在python中用来创建迭代器的功能。 这是一个复杂的主题,但是您可以在for循环之前编写此行

options = []

而不是yield dict(...)编写options.append(dict(...)) 并且在函数的最后return options

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM