函数内部exec()中定义的子函数的解决方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (76)

我正在编写一个需要包含子函数的curve_fit函数,以便从scipy.optimize模块运行函数。问题是进入子功能的变量数量(让我们称之为fitFunc)取决于数据框输入主函数的列数。以下是我的代码:

def function(mod_data):
    import numpy as np
    i = 0
    ps = len(mod_data.columns) - 7
    temp = '(xdat[0]**b)'

    while i != (ps-1):
        dummypy = '(xdat[' + str(i+1) + ']'
        temp = temp + '+' + dummypy + '**b)'
        i += 1

    xdat = mod_data.iloc[:,7:].values
    xdat = np.transpose(xdat)
    ydat = mod_data.iloc[:,1].values

    form = 'def fitFunc(xdat, a, b): return (a/ps) * (%s)' % temp
    exec(form)
    result = curve_fit(fitFunc, xdat, ydat, 
                       p0 = np.array([100000,.75]))
    return result

以上mod_data是包含建模过程变量的数据框。form如果xdat分别有两行或三行,则应为以下字符串:

# xdat has 2 rows
form = 'def fitFunc(xdat, a, b): return (a/ps) * ((xdat[0]**b)+(xdat[1]**b))'

# xdat has 3 rows
form = 'def fitFunc(xdat, a, b): return (a/ps) * ((xdat[0]**b)+(xdat[1]**b)+(xdat[2]**b))'

我意识到我可以定义函数,但问题是我不知道在数据框输入函数之前实际上有多少变量,所以我运行最后一列以找到该数字,然后写代码为我编写函数,具体取决于将有多少变量。

我知道上一个问题exec在函数中有子函数时不起作用:为什么exec不能在带有子函数的函数中工作?。所以我的目标是找到另一种方法来定义fitFunc子函数,具体取决于数据帧中xdat有多少变量mod_data。提前感谢任何建议。

提问于
用户回答回答于

没有必要动态创建函数并使用exec。只是迭代xdat

def fitFunc(xdat, a, b):
    return (a/ps) * sum(x**b for x in xdat)

扫码关注云+社区

领取腾讯云代金券