【问题标题】:How to use boost::numpy::from_data in boost-numpy library如何在 boost-numpy 库中使用 boost::numpy::from_data
【发布时间】:2016-10-15 15:32:16
【问题描述】:

我正在使用 boost.numpy 并尝试制作 ndarray 包装器。我正在尝试将 ndarray 从 python 发送到 c++ 和 c++ 到 python。当我将 ndarray 从 python 发送到 c++ 时,出现了问题。哪里不对?

+++mod2.cpp+++
1 #include"boost/numpy.hpp"
2 #include<iostream>
3 
4 boost::numpy::ndarray test(boost::numpy::ndarray a){
5   boost::numpy::ndarray b = a;
6  int arr[]={5,4,3,2,1};
7   b =      boost::numpy::from_data(arr,boost::numpy::dtype::get_builtin<int>(),
8       boost::python::make_tuple(5),boost::python::make_tuple(sizeof(int)),boost::python::object());
9    std::cout << "In mymod2.cpp:" <<
10      boost::python::extract < char const * > (boost::python::str(b)) << std::endl ; 
11   return b;
12 }
13 
14 BOOST_PYTHON_MODULE(mymod2){
15   boost::numpy::initialize();
16   boost::python::def("test",test);
17 }               

+++demo.py+++
1 import numpy
2 import mymod2
3 
4 Mat1 = numpy.array([1,2,3,4,5], dtype=numpy.int32)
5 print("In demo.py:",Mat1)                                                                                         
6 Mat2=mymod2.test(Mat1)
7 print("In demo.py:",Mat2)

+++Output+++
In demo.py: [1 2 3 4 5]
In mymod2.cpp:[5 4 3 2 1]
In demo.py: [        0        48 430934944     32509         3]

【问题讨论】:

    标签: python c++ numpy boost multidimensional-array


    【解决方案1】:

    我不明白为什么,但如果你使用:

    int *arr;
    arr = new int[5];
    arr[0] = 5;
    arr[1] = 4;
    arr[2] = 3;
    arr[3] = 2;
    arr[4] = 1;
    

    而不是int arr[]={5,4,3,2,1},它将正确的数组返回给python代码。

    【讨论】:

      【解决方案2】:

      int arr[]={5,4,3,2,1} 在堆栈上。 from_data 引用传递给它的数据,它不会复制它,因此您在 ndarray.xml 中返回堆栈地址。使用 new 意味着可以避免这个问题,因为内存在堆上,但现在数据正在泄漏。释放ndarri时需要使用owner参数来管理内存的整理。

      【讨论】:

        【解决方案3】:

        你可以在返回数组之前创建一个新的引用

        np::ndarray new_b = b.copy();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-13
          • 2018-10-14
          • 2017-08-11
          • 1970-01-01
          • 2018-12-04
          • 2014-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多