我正在尝试在cfunc
中将Numba scipy.LowLevelCallable
用作ndi.generic_filter
,但是我面临签名匹配的问题。如果将返回类型设置为int16
,则将其识别为short
,如果我将其设置为int32
或intc
,则会显示long
。两个签名不能匹配。匹配问题是返回类型
import numpy as np
import scipy
from numba import cfunc, carray, types
import scipy.ndimage as ndi
@cfunc("intc (CPointer(float64),intp, CPointer(float64), voidptr)") #problematic
def myfunc(values_ptr, len_values, result, data):
#some work here
return 1
footprint = np.array([[0, 1, 0],[1, 1, 1],[0, 1, 0]], dtype=bool)
from scipy import ndimage as ndi
a=np.random.random((100,100))
ndi.generic_filter(a, scipy.LowLevelCallable(myfunc.ctypes), footprint=footprint)
这是错误:
ValueError: Invalid scipy.LowLevelCallable signature "long (double *, long, double *, void *)". Expected one of: ['int (double *, intptr_t, double *, void *)', 'int (double *, npy_intp, double *, void *)', 'int (double *, int, double *, void *)', 'int (double *, long, double *, void *)']
系统规格(如果有):Python 2.7.10(32位),Numba 0.39.0
答案 0 :(得分:2)
您似乎遇到了this known issue。具体来说,在LowLevelCallable
和int
具有相同大小(例如Windows的64位版本)的平台上,似乎没有办法用Numba产生long
期望的签名。 / p>
我建议您支持GitHub上的修复程序。同时,最好的选择是将Numba函数直接传递到generic_filter
并接受一些函数调用开销,或者以受支持的方式包装函数,例如通过Cython。