将数组从C代码返回到python
我在Python中分配了一个3D数组,并将其传递给我正在编写的类型为double*的库。在我的C代码中,我使用将数组从C代码返回到python,python,arrays,3d,ctypes,memcpy,Python,Arrays,3d,Ctypes,Memcpy,我在Python中分配了一个3D数组,并将其传递给我正在编写的类型为double*的库。在我的C代码中,我使用 double ***coords_mle = (double ***)malloc(num_coords*sizeof(double**)); for (i = 0; i < num_coords; i++) { coords_mle[i] = (double **)malloc((end_frame-start_frame+1)*sizeof(double*));
double ***coords_mle = (double ***)malloc(num_coords*sizeof(double**));
for (i = 0; i < num_coords; i++) {
coords_mle[i] = (double **)malloc((end_frame-start_frame+1)*sizeof(double*));
for (j = 0; j < end_frame-start_frame+1; j++)
coords_mle[i][j] = (double *)malloc(2*sizeof(double)); }
double***coords\u mle=(double***)malloc(num\u coords*sizeof(double**));
对于(i=0;i
并用值填充。我正在动态创建数组,因为它取决于python代码中的参数。C库中的数组已正确填充。我尝试使用以下两种方法将数组返回到double*指针
标准::副本(**coords_-mle,**coords_-mle+2*3*3,coords_-ret);
或
memcpy(coords_ret,**coords_mle,2*3*3*sizeof(双倍))
(2*3*3是数组的维度)。然而,我在python中得到的只有我期望的几个值。数组的其余部分填充了其他数字
使用ctypes将3D数组从C返回到python的最佳方法是什么 实际上,我推荐赛顿。Ctypes在python-C边界上有点慢,也有点脆弱。我喜欢将Ctypes用于以CPython和Pypy为目标的多解释器代码,尽管今天CFFI可能会更好
如果您真的需要ctypes,您可以创建一个具有适当长度(dimx*dimy*dimz)的array.array('d'),并通过ctypes将其传递给您的C代码。array.array应该创建连续的传统数组,因此它可能会工作。您不会返回三维C数组。这将通过单个连续分配来实现:
#include <stdlib.h>
double *test(int ni, int nj, int nk)
{
int i, j, k;
size_t n, njk, nijk;
njk = nj * nk;
nijk = ni * njk;
double *result = (double *)malloc(nijk * sizeof(double));
for (i = 0; i < ni; i++)
for (j = 0; j < nj; j++)
for (k = 0; k < nk; k++) {
n = i * njk + j * nk + k;
*(result + n) = n;
}
return result;
}
更地道的说法是:
>>> [[row[:] for row in grid] for grid in a]
[[[0.0, 1.0], [2.0, 3.0]], [[4.0, 5.0], [6.0, 7.0]]]
>>> [[a[i][j][:] for j in range(2)] for i in range(2)]
[[[0.0, 1.0], [2.0, 3.0]], [[4.0, 5.0], [6.0, 7.0]]]
>>> [[row[:] for row in grid] for grid in a]
[[[0.0, 1.0], [2.0, 3.0]], [[4.0, 5.0], [6.0, 7.0]]]