使用ctypes将numpy二维数组传递给c函数的正确方法是什么?到目前为止,我目前的方法(导致segfault):
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)
4条答案
按热度按时间hc2pp10m1#
这可能是一个迟来的答案,但我终于让它工作了。所有的功劳都归sturla molden在this link。
关键是,注意
double**
是np.uintp
类型的数组。然后使用
doublepp
做为型别,传入xpp
。请参阅随附的完整程式码。C代码:
Python代码:
希望能有所帮助,
尚
dxxyhpgq2#
如果要在函数中使用
double **
,必须将指针数组传递给double(而不是2d数组):另一个(如@eryksun所建议):传递一个指针并进行一些运算以获得索引:
wf82jlnq3#
虽然答复可能较迟,但我希望它可以帮助其他有同样问题的人。
由于numpy数组在内部保存为1d数组,因此可以在C中简单地重建2d形状。
和
如果您使用
gcc -shared -fPIC libtest2d.c -o libtest2d.so
编译代码,然后运行python test2d.py
,它应该打印数组。我希望这个例子多少能说明一些问题。其思想是,形状也被赋予C代码,然后C代码创建一个
double **
指针,为该指针保留了额外指针的空间。然后这些指针被设置为指向原始数组的正确部分。PS:我是一个相当初学者在C,所以请评论,如果有理由不这样做。
sdnqo3pr4#
这里我传递了两个二维numpy数组,并打印了一个数组的值作为引用
您可以在cpp中使用和编写自己的逻辑
cpp_function.cpp
编译时使用:
g++ -shared -fPIC cpp_function.cpp -o cpp_function.so
Python文件
main.py