如何为 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)}
问题是我无法为 loop.Can 编写 5-nested 谁能演示一下如何编写递归函数以给出所有可能参数组合的列表?
谢谢
您可以使用 itertools.product
函数,它获取迭代器列表并创建其笛卡尔积的迭代器(参见 documentation)。
在我的解决方案中,我使用 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()
将 return [(1, 2, 3), (4, 5, 6)]
。做 dictionary.keys()
会得到 ['a', 'b']
.
注意:这里Python2和Python3是有区别的——在Python2这些方法中(keys()
和 values()
) 将 return 普通列表,而在 Python 3 它们 return 一个特殊的迭代器。这不应该改变解决方案。
product(*parameter.values())
我们使用星号来 "unpack" 列表。简而言之,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
.
瞧。
我正在尝试编写一段代码来遍历具有 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)}
问题是我无法为 loop.Can 编写 5-nested 谁能演示一下如何编写递归函数以给出所有可能参数组合的列表? 谢谢
您可以使用 itertools.product
函数,它获取迭代器列表并创建其笛卡尔积的迭代器(参见 documentation)。
在我的解决方案中,我使用 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()
将 return [(1, 2, 3), (4, 5, 6)]
。做 dictionary.keys()
会得到 ['a', 'b']
.
注意:这里Python2和Python3是有区别的——在Python2这些方法中(keys()
和 values()
) 将 return 普通列表,而在 Python 3 它们 return 一个特殊的迭代器。这不应该改变解决方案。
product(*parameter.values())
我们使用星号来 "unpack" 列表。简而言之,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
.
瞧。