首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >函数内exec()中定义的子函数的解决方法

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

Stack Overflow用户
提问于 2019-05-14 03:16:04
回答 1查看 30关注 0票数 1

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

代码语言:javascript
复制
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之上是包含建模过程的变量的数据帧。如果xdat有两行或三行,则form应为以下字符串:

代码语言:javascript
复制
# 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))'

我意识到我可以只定义函数,但问题是,在进入函数之前,我不知道数据帧中实际会有多少个变量,所以我遍历了最后一列,以便找到那个数字,然后让代码根据变量的数量为我编写函数。

从前面的问题中我知道,当Why doesn't exec work in a function with a subfunction?函数中有子函数时,exec就不能工作了。因此,我在这里的目标是找到另一种方法来定义fitFunc子函数,这取决于xdat将从mod_data数据帧中获得多少变量。提前感谢您的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-14 03:26:43

不需要动态创建函数并使用exec。只需迭代xdat即可。

代码语言:javascript
复制
def fitFunc(xdat, a, b):
    return (a/ps) * sum(x**b for x in xdat)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56118603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档