2013-05-04 5 views
7

ho una libreria C++ che definisce i seguenti (e più simili a loro) tipi:Utilizzare SWIG per avvolgere C++ <vector> come pitone serie NumPy

typedef std::vector<double> DoubleVec; 

typedef std::vector<DoubleVec> DoubleVecVec; 

typedef std::vector<int> IntVec; 

typedef std::vector<IntVec> IntVecVec; 

Sto cercando di creare un'interfaccia Python per una libreria che maniglie oggetti del genere. Come afferma il titolo, vorrei che la mia interfaccia convertisse in/da C++ std::vector e numpy ndarray.

Ho visto entrambi i numeri numpy.i forniti da Numpy People e std_vector.i da persone SWIG. I problemi sono che numpy.i è stato creato per gestire gli array C/C++ (non i vettori C++) e std_vector.i non esegue direttamente la conversione da/per gli array di numpy.

Qualche idea?

Ho visto che il progetto FEniCS ha fatto qualcosa del genere, ma il loro progetto è talmente grande che sto facendo fatica a scoprire solo come fanno questo compito specifico.

risposta

2

Prova questo come punto di partenza.

%include "numpy.i" 

%apply (size_t DIM1, double* IN_ARRAY1) {(size_t len_, double* vec_)} 

%rename (foo) my_foo; 
%inline %{ 
int my_foo(size_t len_, double* vec_) { 
    std::vector<double> v; 
    v.insert(v.end(), vec_, vec_ + len_); 
    return foo(v); 
} 
%} 

%apply (size_t DIM1, size_t DIM2, double* IN_ARRAY2) {(size_t len1_, size_t len2_, double* vec_)} 

%rename (bar) my_bar; 
%inline %{ 
int my_bar(size_t len1_, size_t len2_, double* vec_) { 
    std::vector< std::vector<double> > v (len1_); 
    for (size_t i = 0; i < len1_; ++i) { 
     v[i].insert(v[i].end(), vec_ + i*len2_, vec_ + (i+1)*len2_); 
    } 
    return bar(v); 
} 
%}