gpt4 book ai didi

c++ - 使用 SWIG 将 C++ 包装为 python NumPy 数组

转载 作者:可可西里 更新时间:2023-11-01 17:56:59 26 4
gpt4 key购买 nike

我有一个 C++ 库,它定义了以下(以及更多类似的)类型:

typedef std::vector< double > DoubleVec;

typedef std::vector< DoubleVec > DoubleVecVec;

typedef std::vector< int > IntVec;

typedef std::vector< IntVec > IntVecVec;

我正在尝试为处理此类对象的库创建一个 python 接口(interface)。正如标题所述,我希望我的界面能够与 C++ std::vector 和 numpy ndarray 相互转换。

我都看过 numpy.i由 numpy 人和 std_vector.i 提供来自 SWIG 人。问题在于 numpy.i 是为处理 C/C++ 数组(而非 C++ vector )而创建的,而 std_vector.i 不直接与 numpy 数组进行转换。

有什么想法吗?

我已经看到 FEniCS project 已经做了类似的事情,但是他们的项目太大了,我很难弄清楚他们是如何完成这个特定任务的。

最佳答案

以此为起点。

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

关于c++ - 使用 SWIG 将 C++ <vector> 包装为 python NumPy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16377503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com