【发布时间】:2014-04-20 23:30:05
【问题描述】:
使用 ctypes 将 numpy 2d 数组传递给 c 函数的正确方法是什么? 到目前为止我目前的方法(导致段错误):
C 代码:
void test(double **in_array, int N) {
int i, j;
for(i = 0; i<N; i++) {
for(j = 0; j<N; j++) {
printf("%e \t", in_array[i][j]);
}
printf("\n");
}
}
Python 代码:
from ctypes import *
import numpy.ctypeslib as npct
array_2d_double = npct.ndpointer(dtype=np.double,ndim=2, flags='CONTIGUOUS')
liblr = npct.load_library('libtest.so', './src')
liblr.test.restype = None
liblr.test.argtypes = [array_2d_double, c_int]
x = np.arange(100).reshape((10,10)).astype(np.double)
liblr.test(x, 10)
【问题讨论】:
-
您知道
double **和double [N][N]在C 中不能互换,不是吗? -
我的问题是我在我的 c 代码中使用双 ** 有什么解决方案吗?
-
好吧,我不知道python也不知道numpy,但是如果是NxN数组,你应该将
in_array声明为double (*in_array)[N],其中N是第二维的大小。 -
如果 N 在运行时不固定,这将如何工作?
-
我想你的意思是如果它在编译时没有固定。在这种情况下,如果您有支持 VLA 的 C99 编译器,您可以将
test声明为void test(int width, double in_array[][width]),但我怀疑这是否适用于numpy。也许你最好等熟悉的人,我真的不知道你是否可以使用numpy。