Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数组从C代码返回到python_Python_Arrays_3d_Ctypes_Memcpy - Fatal编程技术网

将数组从C代码返回到python

将数组从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*));

我在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*));
    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]]]