Cython:如何在Cython中返回函数

jbb*_*j94 5 python cython python-2.7

我需要对一个带有参数lenscale和sigvar的函数进行cythonize,以便构造一个函数。我希望无需将k_se设置为类就可以做到这一点。当我运行以下代码时:

ctypedef float (*kfunc)(float, float)

cdef kfunc k_se(float lenscale, float sigvar):
    cdef float f(float xi, float xj):
        return sigvar**2. * _np.exp(-(1./(2. * lenscale**2.)) *\
                                    _npl.norm(xi - xj)**2)
    return f
Run Code Online (Sandbox Code Playgroud)

我得到错误:

Error compiling Cython file:
------------------------------------------------------------
...

cdef kfunc k_se(float lenscale, float sigvar):
        cdef float f(float xi, float xj):
                                   ^
    ------------------------------------------------------------

BUILDGP.pyx:15:36: C function definition not allowed here
Run Code Online (Sandbox Code Playgroud)

我也尝试过尝试返回一个lambda,cython也不能编译该lambda。有什么想法,我必须为k_se函数创建一个构造函数类吗?

Dav*_*ker 3

您可以构造一个类,该类可以使用一组参数进行初始化并充当可调用的:

class Function():
    def __init__(self, float lenscale):
        self.lenscale = lenscale

    def __call__(self, float xi):
        return self.lenscale*xi


f = Function(10)
print f(5)
Run Code Online (Sandbox Code Playgroud)

cython 文档对此有更多详细信息。