2016-09-14 3 views
1

Следующие примеры и Numpy C-API (http://docs.scipy.org/doc/numpy/reference/c-api.html), я пытаюсь получить доступ к Numpy массива данных в CPP, как это:Доступ Numpy массива данных в C (для NumPy 1.7+)

#include <Python.h> 
#include <frameobject.h> 
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION // TOGGLE OR NOT 
#include "numpy/ndarraytypes.h" 
#include "numpy/arrayobject.h" 
... 
// here I have passed "some_python_object" to the C code 
// .. and "some_python_object" has member "infobuf" that is a numpy array 
// 
unsigned long* fInfoBuffer; 
PyObject* infobuffer = PyObject_GetAttrString(some_python_object, "infobuf"); 
PyObject* x_array = PyArray_FROM_OT(infobuffer, NPY_UINT32); 
fInfoBuffer   = (unsigned long*)PyArray_DATA(x_array); // DOES NOT WORK WHEN API DEPRECATION IS TOGGLED 

Когда АНИ устаревания переключен, я получаю, при компиляции:

error: cannot convert ‘PyObject* {aka _object*}’ to ‘PyArrayObject* {aka tagPyArrayObject*}’ for argument ‘1’ to ‘void* PyArray_DATA(PyArrayObject*)’ 

что бы законным способом сделать это в Numpy 1.7+?

ответ

1

Вы можете попробовать использовать библиотеку более высокого уровня, которая обертывает массивы numpy в контейнерах C++ с правильной семантикой контейнера.

Попробуйте xtensor и xtensor-python крепления.

Существует также cookiecutter для создания минимального C++ проекта расширения со всеми шаблонной для тестирования, HTML документации и setup.p ...

Пример: код C++

#include <numeric>      // Standard library import for std::accumulate 
#include "pybind11/pybind11.h"   // Pybind11 import to define Python bindings 
#include "xtensor/xmath.hpp"    // xtensor import for the C++ universal functions 
#define FORCE_IMPORT_ARRAY    // numpy C api loading 
#include "xtensor-python/pyarray.hpp"  // Numpy bindings 

double sum_of_sines(xt::pyarray<double> &m) 
{ 
    auto sines = xt::sin(m); 
    // sines does not actually hold any value, which are only computed upon access 
    return std::accumulate(sines.begin(), sines.end(), 0.0); 
} 

PYBIND11_PLUGIN(xtensor_python_test) 
{ 
    xt::import_numpy(); 
    pybind11::module m("xtensor_python_test", "Test module for xtensor python bindings"); 

    m.def("sum_of_sines", sum_of_sines, 
     "Computes the sum of the sines of the values of the input array"); 

    return m.ptr(); 
} 

Python код:

import numpy as np 
import xtensor_python_test as xt 

a = np.arange(15).reshape(3, 5) 
s = xt.sum_of_sines(v) 
s 
+0

Вопрос refered к C-API, ответ связан с кодом C++. Остается вопрос, как это сделать с использованием C-API. – rhody

+2

В рассматриваемом коде C++ используется C API и обертывается в конструкциях более высокого уровня. Кроме того, в исходном вопросе говорится: «Я пытаюсь получить доступ к массивам данных numpy в cpp», – Quant

Смежные вопросы