python - 从 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 数组使用?
解决方案
找到了一个非常简单的方法来解决这个问题,所以我会发布它以防万一其他人遇到这个问题。
我尝试通过 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]
推荐阅读
- c - 带有 DMA 7 通道常规组的 STM32F4 ADC 不工作
- c++ - 为什么我的虚拟方法没有被用于这种类型层次结构中的基类?
- r - 为什么 R 中 psych::omega 和 psych::alpha 之间的 alpha 值不同?
- symfony - 仅对一条路由禁用路由前缀
- php - 未捕获的 GuzzleHttp\Exception\ConnectException:cURL 错误 7:(XeroAPI)
- git - 使用 ssh 连接到实时服务器并将我的 git 推送到其中
- mysql - 如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?
- asp.net-core - 使用 ASP..NET Core REST API 服务的 Uno WebAssembly 上的 CORS 错误
- flutter - TextField 需要方向性属性
- xcode - xcode 界面生成器中的空助手编辑器