Python 如何在BoostNumpy库中使用boost::numpy::from_数据

Python 如何在BoostNumpy库中使用boost::numpy::from_数据,python,c++,numpy,boost,multidimensional-array,Python,C++,Numpy,Boost,Multidimensional Array,我正在使用boost.numpy并尝试制作ndarray包装器。我试图从Python发送NDARE到C++和C++到Python。当我从Python发送nDRAIL到C++时,问题就发生了。什么是不正确的 +++mod2.cpp+++ 1 #include"boost/numpy.hpp" 2 #include<iostream> 3 4 boost::numpy::ndarray test(boost::numpy::ndarray a){ 5 boost::numpy::n

我正在使用boost.numpy并尝试制作ndarray包装器。我试图从Python发送NDARE到C++和C++到Python。当我从Python发送nDRAIL到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]
+++mod2.cpp+++
1#包括“boost/numpy.hpp”
2#包括
3.
4 boost::numpy::ndarray测试(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(),
8 boost::python::make_tuple(5),boost::python::make_tuple(sizeof(int)),boost::python::object();

9 std::cout我不明白为什么,但如果您使用:

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

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

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

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

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

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

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

您可以在返回数组之前,使用

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

在返回数组之前,可以创建对该数组的新引用

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