我想将一个二维numpy数组传递给一个cdef函数,其中数组的维度可以变化。以下是我的尝试:
当我编译时,出现错误提示“无法获取Python对象的地址”,并指向
cimport numpy as cnp
input = numpy.array([[3.34, 2.2],[1.1, -0.6]])
input = input[:,:].astype(np.double)
cdef int nrows = 2
cdef int ncols = 2
# output of function
cdef cnp.ndarray[cnp.uint8_t, ndim=2] output = np.zeros((2,2), dtype=np.uint8)
test_array(nrows, ncols, &input[0], <unsigned char**>output.data)
我的 test_array 函数在哪里:
cdef void test_array(Py_ssize_t nrows, Py_ssize_t ncols, double **x, unsigned char **output) nogil:
output[0][0]=1
output[1][0]=0
output[1][1]=1
output[0][1]=0
我的函数原型是:
cdef void test_array(Py_ssize_t nrows, Py_ssize_t ncols, double **x, unsigned char **output) nogil
当我编译时,出现错误提示“无法获取Python对象的地址”,并指向
&input[0]
。这种语法适用于一维数组,但我不确定二维数组的语法是什么。我也尝试过&input[0][0]
,但那也是错误的。
[0,0]
。 - Pierre de Buylinput
的指针。这对于 Cython 的 C 部分来说是未知的,因此您必须将数据作为 typed memoryview 传递。如果您将 NumPy 数组传递给需要 typed memoryview 的函数,则它将按预期运行 :-) - Pierre de Buyl