我正在尝试将Numbacfunc用作scipy.LowLevelCallable内部,ndi.generic_filter但是我面临签名匹配的问题。如果我将返回类型设置为int16它,short则将其识别为好像我设置为int32或intc它说long。这两个签名不能匹配。匹配的问题是返回类型import numpy as npimport scipyfrom numba import cfunc, carray, typesimport scipy.ndimage as ndi@cfunc("intc (CPointer(float64),intp, CPointer(float64), voidptr)") #problematicdef myfunc(values_ptr, len_values, result, data): #some work here return 1footprint = np.array([[0, 1, 0],[1, 1, 1],[0, 1, 0]], dtype=bool)from scipy import ndimage as ndia=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
1 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
看来您遇到了这个已知问题。具体而言,似乎没有办法以产生由所期望的签名LowLevelCallable
上的平台与Numba其中int
和long
是相同的尺寸(如64种Windows的口味)。
我建议您支持GitHub上的修复程序。同时,最好的选择是直接将Numba函数传递到generic_filter
并接受一些函数调用开销,或者以受支持的方式包装函数,例如通过Cython。
添加回答
举报
0/150
提交
取消