gpt4 book ai didi

python - 如何编写包装器来修复函数中的任意参数

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:52 24 4
gpt4 key购买 nike

我想编写一个曲线拟合脚本,它允许我修复以下形式的函数的参数:

def func(x, *p):
assert len(p) % 2 == 0
fval = 0
for j in xrange(0, len(p), 2):
fval += p[j]*np.exp(-p[j+1]*t)
return fval

例如,假设我希望 p = [p1, p2, p3, p4],并且希望 p2 和 p3 为常数 A 和 B(从 4 参数拟合变为 2 参数拟合)。我知道 functools.partial 不允许我这样做,这就是我想编写自己的包装器的原因。但我这样做有点困难。这是我到目前为止所拥有的:

def fix_params(f, t, pars, fix_pars):
# fix_pars = ((ind1, A), (ind2, B))
new_pars = [None]*(len(pars) + len(fix_pars))
for ind, fix in fix_pars:
new_pars[ind] = fix
for par in pars:
for j, npar in enumerate(new_pars):
if npar == None:
new_pars[j] = par
break
assert None not in new_pars
return f(t, *new_pars)

我认为这个问题是,scipy.optimize.curve_fit 对于通过这种包装器传递的函数不能很好地工作。我应该如何解决这个问题?

最佳答案

听起来你想做的是柯里化(Currying)?在 Python 中,您可以使用内部函数来做到这一点。

示例:

def foo(x):
def bar(y):
return x + y
return bar

bar = foo(3)
print(type(bar)) # a function (of one variable with the other fixed to 3)
print(bar(8)) # 11
bar = foo(9)
print(bar(8)) # 17

这样我们就可以在函数 x + y 中修复 x 了。您也可以将其放入装饰器中。

这是有人写的关于这样做的博客文章: https://mtomassoli.wordpress.com/2012/03/18/currying-in-python/

关于如何与外部库配合良好,这里的函数 foo 将返回一个函数。在 Python 中,函数是一等对象。因此,您向返回的函数提供的任何内容都只会将其视为函数。

关于python - 如何编写包装器来修复函数中的任意参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com