2016-06-14 6 views
1

Ich benutze boost.numpy und versuche, einen ndarray-Wrapper zu erstellen. Ich versuche, ndarray von Python zu C++ und C++ zu Python zu senden. Als ich ndarray von Python nach C++ schickte, ist das Problem aufgetreten. Was ist falsch?Wie boost :: numpy :: from_data in der boost-numpy-Bibliothek verwendet wird

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

Antwort

0

konnte ich nicht verstehen, warum, aber wenn Sie verwenden:

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

statt int arr[]={5,4,3,2,1}, es wird die richtige Anordnung zu Python-Code zurück.

0

int arr [] = {5,4,3,2,1} ist auf dem Stapel. from_data referenziert die Daten, die an es übergeben werden, es kopiert es nicht, so dass Ihre zurückkommenden Stapeladressen in dem NDarray. Wenn Sie new verwenden, wird dieses Problem vermieden, da sich der Speicher auf dem Heap befindet. Jetzt sind die Daten jedoch undicht. Sie müssen den owner-Parameter verwenden, um das Aufräumen des Speichers zu verwalten, wenn der ndarry freigegeben wird.

Verwandte Themen