Доступ к матрице Numpy из C в виде трехмерного массива - PullRequest
0 голосов
/ 14 июня 2019

Я заметил, что можно создать заимствованную / украденную ссылку на (3D) массив пустых чисел, используя PyArray_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_DATA, тем не менее, это дает одномерное плоское представление матрицы как void *, ссылающейся на первый элемент матрицы.

Есть ли способ, которым я могу получить ссылку на внутренний массив, используя этот последний вызови все еще сможете работать с массивом как с массивом 3D C?

1 Ответ

1 голос
/ 18 июня 2019

Обнаружил довольно простой способ решения этой проблемы, поэтому я опубликую его на тот случай, если кто-то еще столкнется с этим.

Я попытался решить его с помощью указателя 2D структур, но в конце концов, всемне нужно было привести указатель на трехмерные структуры:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...