将相同的输入有效地映射到多个功能

时间:2018-12-04 19:51:15

标签: arrays python-3.x numpy scipy ode

我正在使用自动构建的大型ODE系统。我有一个长度为state的{​​{1}}数组,并且数组中还存储了相等数量的微分方程。这里有2个,但在实际系统中将有100个以上。微分方程被构造为一个类,并通过n进行调用,或者,创建ODE并使用__call__进行调用。我需要将完全相同的functools partial和时间state发送到数组中的每个微分函数,并填充导数状态向量t。我想知道最干净,最pythonic也是最重要的是最快的方法。

dstate

1 个答案:

答案 0 :(得分:0)

对于编码,(IMO)对您所做的工作没有重大改进。您可以替换单行循环:

def change(t, state):
    return np.array([f(state=state) for f in fs])

关于效率,请检查Calling functions by array index in Python。您能做的最好的事情就是将功能捆绑在一起。在您的示例中:

class F_list:
    def __init__(self):
        pass
    def __call__(self, state):
        return 2 - state[0]**2 * state[1], 3 - state[1]*state[0] 
    def change(self, t, state):
        return self(state)

F = F_list()
sol = integrate.solve_ivp(fun = F.change, t_span = (0, 15), y0 = state0)

还请注意,使用deflambda总是比__call__快,并且如果您想要一个类,并且除非您对实例有特殊需要,可以使用{{ 1}}装饰器,以避免不必要的实例化