【问题标题】:Accessing a Numpy Matrix from C as a 3D array从 C 访问 Numpy 矩阵作为 3D 数组
【发布时间】:2019-06-14 10:55:31
【问题描述】:

我注意到可以使用 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 数组使用?

【问题讨论】:

标签: python c arrays numpy 3d


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2019-02-11
    相关资源
    最近更新 更多