[C++-sig] Accessing 2D array from python in C++

Jim Bosch talljimbo at gmail.com
Tue Aug 14 17:54:16 CEST 2012


On Aug 14, 2012 4:25 AM, "shahmi" <alfarobi0161 at yahoo.com> wrote:
>
> Hi,
>
> I have tried to access/expose 2D array from python in C++ using
boost::multi_array. Nevertheless, it seems that the
boost::multi_array<double, 2> datatype is not supported.  Is there any way
to resolve this? My way of accessing it as below:
>
>             boost::python::object Vp = main_namespace["Vp"];
>             Vp_cpp = boost::python::extract<boost::multi_array<double,
2> >(Vp);
>
> I've also tried to try to use 2D vector as below, nonetheless, it still
doesn't work:
>
>         boost::python::object Vp = main_namespace["Vp"];
>         Vp_cpp = boost::python::extract<std::vector<std::vector<double> >
>(Vp);
>
> The error message I received is "TypeError: No registered converter was
able to produce a C++ rvalue of type std::vector<std::vector<double,
std::allocator<double> >, std::allocator<std::vector<double,
std::allocator<double> > > > from this Python object of type matrix"
>

In general Boost.Python doesn't provide converters for all the other boost
libraries.

The first question is what you want to return in Python; you could wrap
multi_array itself using class_.  You could also return a nested list or
tuple.
If you want to use numpy, you'll probably want a helper library like this
one:
https://github.com/ndarray/Boost.NumPy

In either of the last two cases, you can either write your own converter
and add it to the converter registry (harder, but reusable), or write a
custom wrapper for the function that returns a 2-d array (easier, but not
good if you have many such functions).

HTH

Jim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20120814/c803f979/attachment.html>


More information about the Cplusplus-sig mailing list