我有一个返回二维数组(实际上是double**)的C函数,我想使用ctypes将其传递给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**
不是一个二维数组。 - user2357112double**
是一个数组的数组。使用这个答案中的方法可能会更容易:https://dev59.com/MWXWa4cB1Zd3GeqPRN0C#11385138(定义一个带有多维数组的结构体,并传递指向该结构体的指针)。 - Nick ODellF_arr [i] [j]
访问Python中的数据。您想将其用作numpy数组吗?如果是,由于不同的内存布局,您需要将数据复制到numpy数组中。 - ead