numba ctype与ndfilter匹配

时间:2018-08-03 09:42:55

标签: python scipy numba ndimage

我正在尝试在cfunc中将Numba scipy.LowLevelCallable用作ndi.generic_filter,但是我面临签名匹配的问题。如果将返回类型设置为int16,则将其识别为short,如果我将其设置为int32intc,则会显示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

1 个答案:

答案 0 :(得分:2)

您似乎遇到了this known issue。具体来说,在LowLevelCallableint具有相同大小(例如Windows的64位版本)的平台上,似乎没有办法用Numba产生long期望的签名。 / p>

我建议您支持GitHub上的修复程序。同时,最好的选择是将Numba函数直接传递到generic_filter并接受一些函数调用开销,或者以受支持的方式包装函数,例如通过Cython。