2013-05-04 78 views
7

我有一個C++庫定義以下(更喜歡他們)類型:使用SWIG包裝C++ <vector>如巨蟒與NumPy陣列

typedef std::vector<double> DoubleVec; 

typedef std::vector<DoubleVec> DoubleVecVec; 

typedef std::vector<int> IntVec; 

typedef std::vector<IntVec> IntVecVec; 

我想創建一個Python接口庫,手柄這樣的對象。正如標題所述,我希望我的接口可以轉換成C++ std::vector和numpy ndarray

我已經看到numpy人提供的numpy.i和swig人提供的std_vector.i。問題是創建了numpy.i來處理C/C++數組(而不是C++向量),並且std_vector.i不直接轉換到/從numpy數組轉換。

任何想法?

我已經看到,FEniCS項目已經做了這樣的事情,但他們的項目太大了,我很難找出他們是如何做這個特定的任務。

回答

2

試試這個作爲一個起點。

%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); 
} 
%}