Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Python 从C作为3D数组访问Numpy矩阵_Python_C_Arrays_Numpy_3d - Fatal编程技术网

Python 从C作为3D数组访问Numpy矩阵

Python 从C作为3D数组访问Numpy矩阵,python,c,arrays,numpy,3d,Python,C,Arrays,Numpy,3d,我注意到,可以使用PyArray\u AsCArray创建一个借用/窃取的浮点数组的引用,如下所示: ... float ***matrix_c; npy_intp dims[3] = {X, Y, Z}; PyArray_Descr *descriptor = PyArray_DescrFromType(NPY_FLOAT32); PyArray_AsCArray(&matrix_pyobject, (void **)&matrix_c, dims, 3, descriptor

我注意到,可以使用
PyArray\u AsCArray
创建一个借用/窃取的浮点数组的引用,如下所示:

...
float ***matrix_c;
npy_intp dims[3] = {X, Y, Z};
PyArray_Descr *descriptor = PyArray_DescrFromType(NPY_FLOAT32);
PyArray_AsCArray(&matrix_pyobject, (void **)&matrix_c, dims, 3, descriptor);
...
但是,当从代码中的不同部分执行此操作时,目的是传输相同的数组,这对我的情况不起作用。我需要每次传输给我一个对内部数组的引用,这样我就可以使用相同的地址

为此,我发现我可以使用
PyArray\u DATA
访问内部数组,而不必担心引用,尽管如此,这提供了一个一维平面视图,将矩阵视为引用矩阵第一个元素的
void*


有没有什么方法可以让我使用最后一次调用获取对内部阵列的引用,并且仍然能够将该阵列作为3D C阵列使用?

找到了一个非常简单的方法来解决这个问题,所以我将发布它,以防其他人遇到这个问题

我试图通过2D结构的指针来解决它,但最终,我所需要的只是转换为指向3D结构的指针:

PyObject *matrix_object;
PyArg_ParseTuple(args, "O", &matrix_object);
float *matrix_c = (float *)PyArray_DATA((PyArrayObject *)matrix_object);
npy_intp *shape = PyArray_DIMS((PyArrayObject *)matrix_object);

// More code...
int numblocks = shape[0];
int blocksize = shape[1];
int elemsize  = shape[2];

float (*structured_matrix)[numblocks][blocksize][elemsize] = (float (*)[numblocks][blocksize][elemsize])matrix_c;

// Access structured_matrix as: structured_matrix[X][Y][Z]

如果你真的需要3D数组,那么你为什么不在C中使用3D数组呢?我得到的数组来自应用程序的Python端。我将一个用于繁重计算阶段的3D Numpy数组传输到C,在C中访问并修改它,然后使用现在修改的Numpy数组继续Python部分。所有这些,无需传输数据或复制(因此我需要直接参考)