我目前正在尝试使用我已编写的Cython代码来实现更好的性能。但是,我在某个方面遇到了问题 我使用scipy.interpolate.ode:
TypeError:f()只需要3个位置参数(给定2个)
可以使用以下代码复制:
import scipy.integrate as inte
import scipy.interpolate
import numpy as np
class model(object):
def __init__(self):
self.r = np.arange(10) #a variable
self.val = np.arange(10,20) #some values already calculated
self.interpol = scipy.interpolate.interp1d(self.r,self.val) #interpolation
#works with python but produces an error with cython
def do_integration(self):
abbrev = lambda i: self.interpol(i) #this is more complex in reality
def f(x,y,i):
return x+abbrev(i)
ode = inte.ode(f,None)
ode.set_integrator('dopri5')
ode.set_f_params(5)
ode.set_initial_value(0,1)
for i in np.arange(0,1,0.1):
ode.integrate(i)
如果f在do_integration之外定义,它也适用于cython。但是,在实际代码中,我定义了4-5个lambda函数,然后在f中使用(主要是从插值中得到一些导数,可能这是一个糟糕的风格?)。因此,在do_integration之外定义f意味着很多工作。
我认为我的问题类似于this one, 但是建议的解决方案并不适用于我:
只是定义
cpdef double f(double x,double y,double i):
给出
此处不允许使用C函数定义
由于我是Cython的新手,我不确定错误消息的原因是什么。有没有人可以帮助我?
非常感谢!