使用提升将数据从 PyObject 复制到浮点数 *

Copy data from PyObject to float * using boost

本文关键字:复制 PyObject 浮点数 数据      更新时间:2023-10-16

我认为这应该很容易,但我无法让它工作。我想从 python 调用一个C++-function。作为论据,我有一个np-array.C++如下所示:

void foo_python(PyObject *p, const int m, const int n){
float *data = new float[m*n];
memcpy(data,PyArray_DATA(p),m*n*sizeof(float));
delete [] data;
}

当我使用 python 调用它时

hello_ext.foo_python(A,A.shape[0], A.shape[1])

我得到

error: cannot convert ‘PyObject* {aka _object*}’ to ‘PyArrayObject* {aka tagPyArrayObject*}’ for argument ‘1’ to ‘void* PyArray_DATA(PyArrayObject*)’

这曾经有效,但是当我包含#include <boost/python/numpy.hpp> 时出现了,这是这个函数中需要的,我ndarrays返回给python。

np::ndarray test() {
int *data = new int[5];
for (int i = 0; i < 5; ++i){
data[i] = i+1;
}
p::tuple shape = p::make_tuple(5);
p::tuple stride = p::make_tuple(sizeof(int));
p::object own;
np::dtype dt = np::dtype::get_builtin<int>();
std::cout << " Here " << std::endl;
np::ndarray array = np::from_data(data, dt, shape, stride, own);
cout<<"Selective Multidimensional array :: "<<std::endl << 
p::extract<char const *>(p::str(array)) << std::endl;
// delete [] data;
return array;
}

这是模块:

BOOST_PYTHON_MODULE(libhello_ext)
{
using namespace boost::python;
Py_Initialize();
boost::python::numpy::initialize();
def("greet", greet);
def("sum", sum);
def("foo_python", foo_python);
def("test", test);
}

我想出的解决方案是用np::ndarray &p替换PyObject *p。然后我可以创建一个指针float *p = reinterpret_cast<float *>(p.get_data()).

然后,可以在Map中使用p,以使用Map<FMatrix > A(data, m, n);创建Eigen::Matrix

typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> FMatrix;