[C++-sig] create boost array from a Numpy PyArray without copying data? (original) (raw)

Sebastian Walter walter at mathematik.hu-berlin.de
Mon Jan 19 13:16:10 CET 2009


-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1

Hello, On the C++ side I have a raw pointer: double *x; I'd like to change its values from within Python by using Numpy. Example code can be found below.

My approach is

  1. make PyArray from existing data *x with PyArray_SimpleNewFromData
  2. create a boost array from the PyArray.

My question is: How can I create a boost::python::numeric::array from a Numpy Pyarray without copying data?

Here my best shot... (compiles and runs but copies the data)

#define PY_ARRAY_UNIQUE_SYMBOL PyArrayHandle #include #include <boost/python.hpp> #include <numpy/noprefix.h>

using namespace std; using namespace boost; using namespace boost::python; using namespace boost::python::numeric;

array test_function(){ int N = 3; double x[] = {1.,2.,3.}; array numpy_x(static_cast(handle<>(PyArray_SimpleNewFromData(1, &N, PyArray_DOUBLE, x)))); double *y = static_cast<double*> PyArray_DATA(numpy_x.ptr()); y[0] = 37.;

for(int n = 0; n<N; ++n){
    cout<<"numpy_x[n]="<<y[n]<<"\t\t"<<"x[n]="<<x[n]<<endl;
}
return numpy_x;

}

BOOST_PYTHON_MODULE(_test) { import_array(); array::set_module_and_type("numpy", "ndarray"); def("test_function", test_function); }

if name == "main": print test_function()

It would be great if anyone knew the answer to my problem.

regards, Sebastian Walter -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

iD8DBQFJdG8K9PBA5IG0h0ARAoOPAJ0Wl/hexJymtrrxmwRMuewSxjuG3wCgka7o Q90ZJlkWV34VfHcrpQqlrGA= =kEyK -----END PGP SIGNATURE-----



More information about the Cplusplus-sig mailing list