2016-06-14 1 views
1

boost.numpy를 사용하고 ndarray 래퍼를 만들려고합니다. 파이썬에서 ndarray를 C++로, C++을 파이썬으로 보내려고합니다. 파이썬에서 ndarray를 C++로 보내면 문제가 발생했습니다. 올바르지 않은 것은 무엇입니까?boost :: numpy :: from_data를 boost-numpy 라이브러리에서 사용하는 방법

+++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] 

답변

0

는 그 이유를 이해할 수 없었다, 그러나 당신이 사용하는 경우 :

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}, 그것은 파이썬 코드에 대한 권리 배열을 반환합니다.

0

int arr [] = {5,4,3,2,1}이 스택에 있습니다. from_data는 전달 된 데이터를 참조하지만 복사하지 않으므로 반환 스택 주소는 ndarray에 있습니다. 새로운 것을 사용한다는 것은 메모리가 힙에 있지만 데이터가 누출되므로이 문제가 발생하지 않는다는 것을 의미합니다. ndarry가 해제 될 때 owner 매개 변수를 사용하여 메모리 정리를 관리해야합니다.

관련 문제