从一个函数和一个偏函数创建一个函数对象
Create a function object from a function and a partial function
我是函数发生器的新手。我正在使用以下功能:
def math_model(n: float):
def crrcn(x, t0: float, amp: float, tau: float, offset: float, dt: float, k: float):
crrcn = np.zeros(np.shape(x))
for i, a in enumerate(x):
if a < (t0 + dt):
crrcn[i] = offset
else:
crrcn[i] = offset + k * amp * (math.exp(n) / (n ** n)) * ((a - (t0 + dt)) / tau) ** n * math.exp( - (a - (t0 + dt)) / tau)
return crrcn
return crrcn
它定义了一个数学模型,我稍后将使用它来用 scipy curve_fit 拟合一些数据。我想使用相同的模型通过以下行构建一个更复杂的模型。
model = partial(math_model(N), dt = 0, k = 1) + math_model(N)
这给了我:
TypeError: unsupported operand type(s) for +: 'functools.partial' and 'function'
据我所知,我无法使用此运算符从两个函数构建一个函数,据我所知 python 中没有函数操作数。如何在不显式评估的情况下从其他函数构建函数?
上一个答案:
这好像是对partial
的误解。
partial(...)
returns一个新函数。它不执行它,它只是创建它。
所以你的行 model = partial(math_model(N), dt = 0, k = 1) + math_model(N)
是无效的,因为你基本上是在做一个 a + b
操作,其中 a
是......一个函数:)
您可能希望做的只是应用模型。这可以使用 math_model(N)(dt = 0, k = 1)
.
来完成
所以
model = math_model(N)(dt = 0, k = 1) + math_model(N)
可能会成功
新编辑:看来我误解了你。您实际上希望通过组合两个函数来创建一个函数。因此,这是某种符号推理。有几个库可以做到这一点,我知道最先进的是 SymPy
. Or if your functions have only one argument, you can use my mini_lambda
例如使用 mini-lambda:
from mini_lambda import x
f1 = x ** 2
f2 = 5 * x
f3 = f1 + f2
print(f3.to_string())
print(f3.evaluate(1))
产量
x ** 2 + 5 * x
6
鉴于该函数依赖于多个变量 mini_lambda 不是 option.But 与 sympy 它很好很容易。
def math_model():
a, o, t, t0, tau, dt, k = sympy.symbols('a, o, t, t0, tau, dt, k')
semi = a * sympy.exp(-(t - t0)/ tau)
reflex = k * a * sympy.exp(-(t -(t0 + dt))/ tau)
double = sympy.Piecewise((o, t < t0),(o + semi, (t0 <= t) & (t < t0 + dt)), (o + semi + reflex, t0 + dt <= t))
return sympy.lambdify([t, t0, dt, k, o, a, tau], double, 'scipy')
感谢您推荐 Sympy。在使用 lambdify 之后,结果是一个 python 函数,在这种情况下它依赖于 scipy 数学函数的定义。
我是函数发生器的新手。我正在使用以下功能:
def math_model(n: float):
def crrcn(x, t0: float, amp: float, tau: float, offset: float, dt: float, k: float):
crrcn = np.zeros(np.shape(x))
for i, a in enumerate(x):
if a < (t0 + dt):
crrcn[i] = offset
else:
crrcn[i] = offset + k * amp * (math.exp(n) / (n ** n)) * ((a - (t0 + dt)) / tau) ** n * math.exp( - (a - (t0 + dt)) / tau)
return crrcn
return crrcn
它定义了一个数学模型,我稍后将使用它来用 scipy curve_fit 拟合一些数据。我想使用相同的模型通过以下行构建一个更复杂的模型。
model = partial(math_model(N), dt = 0, k = 1) + math_model(N)
这给了我:
TypeError: unsupported operand type(s) for +: 'functools.partial' and 'function'
据我所知,我无法使用此运算符从两个函数构建一个函数,据我所知 python 中没有函数操作数。如何在不显式评估的情况下从其他函数构建函数?
上一个答案:
这好像是对partial
的误解。
partial(...)
returns一个新函数。它不执行它,它只是创建它。
所以你的行 model = partial(math_model(N), dt = 0, k = 1) + math_model(N)
是无效的,因为你基本上是在做一个 a + b
操作,其中 a
是......一个函数:)
您可能希望做的只是应用模型。这可以使用 math_model(N)(dt = 0, k = 1)
.
所以
model = math_model(N)(dt = 0, k = 1) + math_model(N)
可能会成功
新编辑:看来我误解了你。您实际上希望通过组合两个函数来创建一个函数。因此,这是某种符号推理。有几个库可以做到这一点,我知道最先进的是 SymPy
. Or if your functions have only one argument, you can use my mini_lambda
例如使用 mini-lambda:
from mini_lambda import x
f1 = x ** 2
f2 = 5 * x
f3 = f1 + f2
print(f3.to_string())
print(f3.evaluate(1))
产量
x ** 2 + 5 * x
6
鉴于该函数依赖于多个变量 mini_lambda 不是 option.But 与 sympy 它很好很容易。
def math_model():
a, o, t, t0, tau, dt, k = sympy.symbols('a, o, t, t0, tau, dt, k')
semi = a * sympy.exp(-(t - t0)/ tau)
reflex = k * a * sympy.exp(-(t -(t0 + dt))/ tau)
double = sympy.Piecewise((o, t < t0),(o + semi, (t0 <= t) & (t < t0 + dt)), (o + semi + reflex, t0 + dt <= t))
return sympy.lambdify([t, t0, dt, k, o, a, tau], double, 'scipy')
感谢您推荐 Sympy。在使用 lambdify 之后,结果是一个 python 函数,在这种情况下它依赖于 scipy 数学函数的定义。