Как я могу получить доступ к массиву во встроенном Python из C ++?

Что было бы хорошим способом получить доступ к массиву 2dim Numpy в C ++? Я уже проверил NUMPY / C API и некоторые другие сообщения, но это не привело меня к дальнейшему. Вот ситуация:

Я определил в файле python с именем Testfile.py следующий массив numpy:

import numpy as np
A = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

Теперь я хотел бы получить доступ к этому массиву в C ++, чтобы использовать его для дальнейших вычислений. Вот что я сделал до сих пор.
Примечание: для простоты я исключил фрагменты кода обработки ошибок и подсчета ссылок.

#define NPY_NO_DEPRECATED_APINPY_1_7_API_VERSION
#define PY_ARRAY_UNIQUE_SYMBOL cool_ARRAY_API
#include <Python.h>
#include <arrayobject.h> // numpy!
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string>

int main(){

// Name of input-file
char pyfilename[] = "Testfile";

// initilaize python interpreter
Py_Initialize();
import_array();

// load input-file
PyObject *pyName = PyUnicode_FromString(pyfilename);
PyObject *pyModule = PyImport_Import(pyName);

// import my numpy array object
char pyarrayname[] = "A";
PyObject *obj = PyObject_GetAttrString(pyModule, pyarrayname);

//------------------------------------------------------------
// The Problem starts here..

// Array Dimensions
npy_intp Dims[] = { PyArray_NDIM(obj) }; // array dimension
Dims[0] = PyArray_DIM(obj, 0); // number of rows
Dims[1] = PyArray_DIM(obj, 1); // number of columns

// PyArray_SimpleNew allocates the memory needed for the array.
PyObject *ArgsArray = PyArray_SimpleNew(2, Dims, NPY_DOUBLE);

// The pointer to the array data is accessed using PyArray_DATA()
double *p = (double *)PyArray_DATA(ArgsArray);

for (int i = 0; i<Dims[0]; i++)
{
for (int j = 0; j<Dims[1]; j++)
{
p[i * Dims[1] + j] = *((int *)PyArray_GETPTR2(obj, i, j));
}
}
// -----------------------------------------------------------Py_Finalize();

return 0;
}

Я использую Python 3.6 и MSVC 2015.

РЕДАКТИРОВАТЬ: Я добавил используемые мной заголовки и немного изменил формулировку проблемы.

РЕДАКТИРОВАТЬ: Я добавил предложенные стратегии решения, предоставленные стриж а также Алан Стокс

0

Решение

После доступа к массиву

double *p = (double*)PyArray_DATA(ArgsArray);
int* pA = (int*)PyArray_DATA(obj);

Вы можете работать с ним как с массивом. Какие размеры?

int height = PyArray_DIM(obj, 0);
int width = PyArray_DIM(obj, 1);

Теперь вы можете использовать этот указатель для доступа к данным в массиве

for ( int i = 0; y<height; y++)
{
for (int j = 0; x<width; x++)
{
p[i * width + j] = pA[i * width + j];
}
}

На самом деле, если вам просто нужно скопировать массив, используйте memcpy или std :: copy на этом этапе.

Тбх, я решил использовать вместо этого boost.python, но это мое собственное предпочтение.

0

Другие решения

Других решений пока нет …