如何将带有数组参数的 Cython 函数导入到 Numba?

chr*_*eck 6 python numpy cython numba

Numba 文档描述了如何通过创建ctypes.CFUNCTYPE. 但是,示例中的 Cython 函数仅接受标量参数。我有一个需要数组的 Cython 函数。如何初始化对应的ctypes.CFUNCTYPE对象?

赛通函数:

cimport numpy as np


ctypedef np.float64_t FLOAT64


cdef api void generate_options(
        FLOAT64 [:] y_error,
        ...
    ):
    ...
Run Code Online (Sandbox Code Playgroud)

Numba 文档描述了如何创建数组类型。但是,在ctypes.CFUNCTYPEraise中使用这些TypeError: item 1 in _argtypes_ has no from_param method,所以我认为它们不打算用作argtypes.


编辑:

评论中建议的解决方案从 Numba 调用该函数,但当我尝试切片时会产生分段错误。如果我之前注释掉最后一行return就不会出现错误。我对 c 类型做错了什么吗?

赛通:

ctypedef np.int8_t INT8
ctypedef np.int64_t INT64
ctypedef np.float64_t FLOAT64


cdef api void generate_options(
        FLOAT64 [:] y_error,
        FLOAT64 [:,:] x,
        FLOAT64 [:] x_pads,
        INT8 [:] x_active,
        INT64 [:,:] indexes,
        long i_start,
        INT64 [:] i_start_by_x,
        INT64 [:] i_stop_by_x,
        int error,
        double delta,
        # buffers
        FLOAT64 [:,:] new_error,
        INT8 [:,:] new_sign,
    ):
    cdef:
        size_t n_stims = new_error.shape[0]
        size_t i_stim
        FLOAT64 [:] x_stim

    for i_stim in range(n_stims):
        if x_active[i_stim] == 0:
            continue
        x_stim = x[i_stim]
    return
Run Code Online (Sandbox Code Playgroud)

Python:

addr = ...
functype = ctypes.CFUNCTYPE(
    None,
    ctypes.POINTER(ctypes.c_double),
    ctypes.POINTER(ctypes.c_double),
    ctypes.POINTER(ctypes.c_double),
    ctypes.POINTER(ctypes.c_int8),
    ctypes.POINTER(ctypes.c_int64),
    ctypes.c_int64,
    ctypes.POINTER(ctypes.c_int64),
    ctypes.POINTER(ctypes.c_int64),
    ctypes.c_int,
    ctypes.c_double,
    ctypes.POINTER(ctypes.c_double),
    ctypes.POINTER(ctypes.c_int8),
)
opt_generate_options = functype(addr)
Run Code Online (Sandbox Code Playgroud)