简体   繁体   中英

Passing a numpy array FROM C++ using boost python

I need to pass a numpy array to a python function from C++. The code is below. The python side:

import numpy as np
import  convert as cv

def f(x):
  x[0] = 5.
  return len(x)

if __name__ == '__main__':
  y = np.array([1., 2., 3., 4.])
  x = cv.func_n(f, y)
  print x

The C++ side:

#include <iostream>
#include <boost/python.hpp>

using namespace boost::python;
double func_n(PyObject* f, numeric::array &x)
{
  std::cerr << "Inside func_n\n";
  return boost::python::call<double>(f, boost::ref(x));
}

BOOST_PYTHON_MODULE(convert)
{
  numeric::array::set_module_and_type("numpy", "ndarray");

  def("func_n", &func_n);

}

What the C++ code is supposed to do is to take a python functopn and a numpy array as two arguments and then pass the numpy array to the python function. The error I an getting is:

Traceback (most recent call last):
  File "mm.py", line 11, in <module>
    x = cv.func_n(f, y)
TypeError: No Python class registered for C++ class class boost::python::numeric::array

Why? Do I have to register the module during the recursive call of the interpreter and, if so, how?

boost::ref(x) returns a boost::reference_wrapper<T> , which allows you to pass references to by-value functions.

The boost::python::call docs show that arguments are treated differently based on their type. If the arg is a boost::reference_wrapper<T> , it effectively passes a reference to x down to Python.

So, in the code above, you were passing the reference to your numeric::array to Python. The function you're calling from Python also accepts a reference.

Now I'm not sure about this, but I suspect that since you were never actually passing a numeric::array between Python/C++, boost::python decided not to wrap it or create converters (since you're really just passing around addresses). This may be why you saw no Python class registered for the numeric::array type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM