簡體   English   中英

Python中的網格搜索功能

[英]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並保持bc相同,但是有時我想循環b並保持ac相同。

我會打開任何建議的解決方案,但我想我會在params字典中指定搜索參數。 例如,要循環a 1,2,3,4,我會說:

`params = dict(a=[1,2,3,4], b=2, c=3)`

如果我不必修改worker1worker2的代碼, worker1worker2

謝謝!

您也許可以使用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,所以這沒有多大意義。

我假設您的輔助函數實際上看起來並不像上面的那樣,您可以使用內置的sumreduce函數進一步簡化代碼。

我不確定我是否理解這個問題。 檢查這是否是您想要的(省略了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM