繁体   English   中英

使用boost python传递一个numpy数组FROM C ++

[英]Passing a numpy array FROM C++ using boost python

我需要将一个numpy数组从C ++传递给python函数。 代码如下。 python方面:

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

C ++方面:

#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);

}

C ++代码应该做的是将python functopn和numpy数组作为两个参数,然后将numpy数组传递给python函数。 我得到的错误是:

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

为什么? 我是否必须在解释器的递归调用期间注册模块,如果是,如何?

boost::ref(x)返回一个boost::reference_wrapper<T> ,它允许您传递对值函数的引用。

boost :: python :: call docs表明参数的类型不同。 如果arg是boost::reference_wrapper<T> ,它会有效地将对x的引用传递给Python。

因此,在上面的代码中,您将对numeric :: array的引用传递给Python。 您从Python调用的函数也接受引用。

现在我不确定这一点,但我怀疑,因为你实际上从未在Python / C ++之间传递一个数字::数组,所以boost :: python决定不包装它或创建转换器(因为你真的只是传遍地址)。 这可能是您没有看到为numeric :: array类型注册的Python类的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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