代码之家  ›  专栏  ›  技术社区  ›  El_Loco

使用boost将数据从PyObject复制到float*

  •  0
  • El_Loco  · 技术社区  · 7 年前

    我想这应该很容易,但我做不到。我想打电话给 C++-function 来自python。作为论据我有一个 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

    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);
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   El_Loco    7 年前

    我想出的解决办法是 PyObject *p 具有 np::ndarray &p . 然后我可以创建一个指针 float *p = reinterpret_cast<float *>(p.get_data()) .

    p 可用于 Map 创建 Eigen::Matrix Map<FMatrix > A(data, m, n); 具有

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