使用SWIG将C ++ <vector>包装为python NumPy数组</vector>

时间:2013-05-04 18:20:46

标签: c++ numpy swig

我有一个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人提供的numpy.i和来自SWIG人的std_vector.i。问题是创建numpy.i来处理C / C ++数组(而不是C ++向量),std_vector.i不直接转换为numpy数组。

有什么想法吗?

我已经看到FEniCS项目做了类似的事情,但是他们的项目非常庞大,以至于我很难找到他们如何完成这项具体任务。

1 个答案:

答案 0 :(得分:3)

以此为出发点。

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