8

次の(およびそれらに似た)型を定義する C++ ライブラリがあります。

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.inumpy の人々とstd_vector.iSWIG の人々の両方から提供されているのを見てきました。問題は、numpy.iC/C++ 配列 (C++ ベクトルではない) を処理するために作成されstd_vector.i、numpy 配列との間で直接変換を行わないことです。

何か案は?

FEniCSプロジェクトがこのようなことを行っているのを見たことがありますが、彼らのプロジェクトは非常に大きいため、彼らがこの特定のタスクをどのように行っているかを知るのに苦労しています.

4

1 に答える 1

4

これを出発点として試してください。

%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);
}
%}
于 2013-05-04T21:07:09.183 に答える