首页 > 解决方案 > 从 C 访问 Numpy 矩阵作为 3D 数组

问题描述

我注意到可以使用PyArray_AsCArray以下方法创建对(3D)numpy 浮点数组的借用/被盗引用:

...
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_DATA,但是这给出了矩阵的 1D 平面视图作为矩阵void *的第一个元素的引用。

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

标签: pythoncarraysnumpy3d

解决方案


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

我尝试通过 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]

推荐阅读