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)