【发布时间】:2019-06-20 20:42:28
【问题描述】:
我有一个 C 函数返回一个二维数组(实际上是 double**),我想使用 ctypes 将此 double** 传递给 python。对此存在疑问,但数组是在参数列表中修改的,而不是使用函数的返回。这是我的代码(C 函数和相应的 python 包装器)
double** flux_function_2d(double *u, double gamma){
double **F;
double p, H;
F = (double **)malloc(4*sizeof(double *));
for (int i = 0; i < 4; i++)
F[i] = (double *)malloc(2*sizeof(double));
p = (gamma - 1.0) * (u[3] - 0.5 * (u[1]*u[1] + u[2]*u[2]) / u[0]);
H = u[3] / u[0] + p / u[0];
F[0][0] = u[1]; F[1][0] = u[1] * u[1] / u[0] + p;
F[2][0] = u[1] * u[2] / u[0]; F[3][0] = u[1] * H;
F[0][1] = u[2]; F[1][1] = u[2] * u[1] / u[0];
F[2][1] = u[2] * u[2] / u[0] + p; F[3][1] = u[2] * H;
return F;
}
def c_flux_function_2d(u, gamma):
flux = np.ctypeslib.load_library("libs/flux.so", ".")
flux.flux_function_2d.argtypes = [POINTER(c_double), c_double]
flux.flux_function_2d.restype = POINTER(POINTER(c_double))
F = flux.flux_function_2d(u.ctypes.data_as(POINTER(c_double)),
c_double(gamma))
F_arr = np.ctypeslib.as_array(F, shape=(4, 2))
return F_arr
错误发生在 F_arr = np.ctypeslib.as_array(F, shape=(4, 2)) 这意味着 numpy 无法解析 ctypes 中指针的指针。
提前致谢!
【问题讨论】:
-
double**不是二维数组。 -
A
double**是一个数组数组。在这个答案中使用这种方法可能更容易:stackoverflow.com/a/11385138/530160(定义一个带有多维数组的结构,并传递一个指向它的指针。) -
@NickODell:它也不是一个数组数组。它是一个指针,恰好可以使用与数组数组相同的语法进行索引。所涉及的内存布局与数组数组完全不同。
-
“传递给python”是什么意思?您始终可以通过
F_arr[i]][j]访问 Python 中的数据。您想将其用作 numpy-array 吗?如果是,由于内存布局不同,您需要将数据复制到 numpy 数组中。 -
您打算如何释放返回的内存?修改作为参数传递的数组意味着 Python 管理内存,您不必处理释放 C 函数中分配的内存。