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

问题描述 投票:0回答:0

Numba 文档描述了如何通过创建 ctypes.CFUNCTYPE

 来导入 Cython 函数
。但是,示例中的 Cython 函数仅采用标量参数。我有一个采用数组的 Cython 函数。如何初始化相应的
ctypes.CFUNCTYPE
对象?

Cython 函数:

cimport numpy as np


ctypedef np.float64_t FLOAT64


cdef api void generate_options(
        FLOAT64 [:] y_error,
        ...
    ):
    ...

Numba 文档描述了如何创建数组类型。但是,在

ctypes.CFUNCTYPE
中使用这些会引发
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

蟒蛇:

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)
python numpy cython numba
© www.soinside.com 2019 - 2024. All rights reserved.