2013-05-04 37 views
7

私は(そしてもっと彼らのような)は、次の種類の定義C++ライブラリがあります。私はそのハンドルライブラリへのPythonインタフェースを作成しようとしています使用SWIGのpython numpyの配列とC++ <vector>

typedef std::vector<double> DoubleVec; 

typedef std::vector<DoubleVec> DoubleVecVec; 

typedef std::vector<int> IntVec; 

typedef std::vector<IntVec> IntVecVec; 

をそのようなオブジェクト。タイトルが述べるように、私のインターフェイスは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); 
} 
%} 
関連する問題