boost :: python从numpy.ndarray中提取c ++值返回值

时间:2015-06-05 15:59:30

标签: python c++ arrays numpy boost

我想使用boost :: python来包装一个返回python值的函数

array(28.4)

类型

numpy.ndarray

我还没能将这个值提取到c ++类型。以下是我迄今为止提出的结果(以及结果):

double resultValue = python::extract<double>(result[0]);
  

:0-d数组无法编入索引

double resultValue = python::extract<double>(result);
  

:没有已注册的转换器能够从numpy.ndarray类型的Python对象生成类型为double的C ++ rvalue

void* resultValue = python::extract<void*>(result);
  

:没有已注册的转换器能够从numpy.ndarray类型的Python对象中提取C ++指针以键入void * __ptr64

有人希望,上一版本中的标准黑客可行 - 但它没有。到目前为止我没有尝试任何std :: type,例如vector。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

也许这会有所帮助:

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

namespace bp = boost::python;
namespace bn = boost::numpy;

#define PY_ASSERT(expr) { if(!(expr)) { \
    PyErr_SetString(PyExc_TypeError, (boost::format("PY_ASSERT(%1%:%2%): !(%3%) '%4%'") % (__FILE__) % (__LINE__) % (expr) % (#expr)).str().c_str()); \
    bp::throw_error_already_set(); \
}; };

#define PY_ASSERT_EQUALS(a, b) { if((a) != (b)) { \
    PyErr_SetString(PyExc_TypeError, (boost::format("PY_ASSERT_EQUALS(%1%:%2%): %3% != %4%") % (__FILE__) % (__LINE__) % (a) % (b)).str().c_str()); \
    bp::throw_error_already_set(); \
}; };

....

auto ret_ext = bp::extract<bn::ndarray>(result);
PY_ASSERT(ret_ext.check());

const bn::ndarray& ret = ret_ext();
PY_ASSERT(bn::equivalent(ret.get_dtype(), bn::dtype::get_builtin<double>()) );
PY_ASSERT_EQUALS(ret.get_nd(), 1);
PY_ASSERT_EQUALS(ret.shape(0), 1);

double resultValue = *reinterpret_cast<double*>(mean.get_data());

请注意,这是未经测试的代码,并未附带保修。

干杯