如何从c ++访问嵌入式python中的numpy数组?

时间:2017-04-16 13:43:42

标签: python c++ arrays numpy c-api

在c ++中访问2dim numpy数组有什么好方法?我已经检查过numpy / c api和其他一些帖子,但这并没有让我更进一步。情况如下:

我在名为Testfile.py的python文件中定义了以下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。

编辑:我添加了我使用的标题,并稍微更改了问题表达。

编辑:我添加了 Swift Alan Stokes

提供的解决方案策略

1 个答案:

答案 0 :(得分:0)

通过

访问数组后
l2 <- lapply(l1, function(i)setNames(tidyr::spread(transform(stack(i), grp=cumsum(ind == 1)), 
                          grp, values), c('ind', paste0('Value', 1:ceiling(length(i)/4)))))

bind_rows(l2, .id = 'Year')

你可以像使用数组一样使用它。什么是尺寸?

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

现在您可以使用该指针访问数组

中的数据
int height = PyArray_DIM(obj, 0);
int width = PyArray_DIM(obj, 1);

实际上,如果您只需要复制数组,请在此时使用memcpy或std :: copy。

Tbh,我考虑过使用boost.python,但这是我自己的偏好。