[英]Grid search function in Python
我正在嘗試編寫一個參數搜索函數來循環遍歷其中一個參數,並重復調用具有與我正在搜索的其他參數相同的所有其他參數的函數。 這是一些示例代碼:
def worker1(a, b, c):
return a + b + c
def worker2(d, e, f):
return d * e * f
def search(model, params):
res = []
# Loop over one of the parameters and repeatedly append to res
if model == 1:
res.append(worker1(**params))
elif model == 2:
res.append(worker2(**params))
return res
params = dict(a=1, b=2, c=3)
print search(1, params)
我有兩個工人,根據我傳遞給search()
的model
標志的值調用它們。 我在這里試圖解決的問題是在if語句上編寫一個循環(在代碼中注釋),以通過僅更改一個參數來重復調用say worker1
。 我希望我的代碼靈活-有時我想循環a
並保持b
和c
相同,但是有時我想循環b
並保持a
和c
相同。
我會打開任何建議的解決方案,但我想我會在params
字典中指定搜索參數。 例如,要循環a
1,2,3,4,我會說:
`params = dict(a=[1,2,3,4], b=2, c=3)`
如果我不必修改worker1
和worker2
的代碼, worker1
也worker2
。
謝謝!
您也許可以使用itertools.product
來調用帶有所有參數組合的工作人員:
http://docs.python.org/2/library/itertools.html#itertools.product
例如
from itertools import product
def worker1(a, b, c):
return a + b + c
def worker2(d, e, f):
return d * e * f
def search(model, *params):
res = []
# Loop over one of the parameters and repeatedly append to res
for current_params in product(*params):
if model == 1:
res.append(worker1(*current_params))
elif model == 2:
res.append(worker2(*current_params))
return res
print search(1, [1,2,3,4], [2], [3])
# more complicated combinations are possible:
print search(1, [1,2,3,4], [2,7,9], [3,13,23,43])
我避免使用關鍵字參數,因為您的工作程序函數采用了不同名稱的args,所以這沒有多大意義。
我假設您的輔助函數實際上看起來並不像上面的那樣,您可以使用內置的sum
和reduce
函數進一步簡化代碼。
我不確定我是否理解這個問題。 檢查這是否是您想要的(省略了model
參數):
>>> def worker1(a, b, c):
return a + b + c
>>> def search(params):
params = params.values()
var_param = filter(lambda p: type(p) == list, params)[0]
other_params = filter(lambda p: p != var_param, params)
return [worker1(x, *other_params) for x in var_param]
>>> search({'a':2, 'b':[3,4,5], 'c':3})
[8, 9, 10]
假設:
worker1()
參數是可交換的(順序無關緊要)。 list
在上面的示例中, b
是您要循環遍歷的變量參數
更新:
如果要保留函數worker1
的參數順序:
def search(params):
params = params.items()
var_param = filter(lambda t: type(t[1]) == list, params)[0]
other_params = filter(lambda t: t != var_param, params)
var_param_key = var_param[0]
var_param_values = var_param[1]
return [worker1(**dict([(var_param_key, x)] + other_params)) for x in var_param_values]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.