2016-04-23 2 views
0

Я ищу для создания общего объекта для подгонки кривой, где я определяю имена параметров, значения и границы. Иногда я хочу использовать входящие данные для определения границ с помощью функции (мин, макс и т. Д.).Объявление функции в списке параметров в python

Вот объект:

class CurveFitObject(object): 
    def __init__(self,paramList,growthEquation): 
     self.paramList = paramList 
     self.gmod = Model(growthEquation) 

    def calcCurveFit(data): 
    for param in self.paramList: 
      self.gmod.set_param_hint(self.paramList['name'], 
            value=self.paramList['value'](data), 
            min=self.paramList['min'](data), 
            max=self.paramList['max'](data)) 

Здесь я пытаюсь использовать np.min (данные), как моя догадка, 0,975 * np.min (данные), как моя нижняя граница, и 1,025 * н.п. .min (data) как моя верхняя граница.

def growthEquation(self, t, A): return A 
keys = ['name','guess','min','max','vary'] 
logisticGrowth = CurveFitObject(
           [dict(zip(keys,['A',np.min,0.975*np.min,1.025*np.min,True])), 
           growthEquation 
           ) 

Я получаю следующее сообщение об ошибке: TypeError: unsupported operand type(s) for *: 'float' and 'function' , которая имеет смысл, поскольку он пытается сделать математику на функции 0.975*np.min, а не 0.975*np.min(data).

Каков наилучший способ реализации этого поведения? Если есть?

ответ

0

Похоже, вы хотите создать оболочку для существующей функции. Например, у вас есть:

0.975*np.min 

Но это не работает, так как он пытается умножить float раз функция. Вы можете создать новую встроенную функцию:

lambda data: 0.957*np.min(data) 

Возможно, это именно то, что вы ищите. Это равносильно заданию имени функции:

def myfunc(data): 
    return 0.957*np.min(data) 

, а затем с помощью myfunc. Разница в том, что синтаксис lambda создает анонимную функцию, которая может быть определена в строке.

+0

Работает отлично. Благодарю. – nven

Смежные вопросы