SWIG Python 传递固定大小数组的引用

2 投票
1 回答
997 浏览
提问于 2025-04-17 22:55

我一直在尝试弄明白如何通过SWIG把固定大小的数组以引用的方式传递给Python。主要是考虑使用numpy.i这个接口。不过,我在网上找不到相关的资料。

对于普通数组传递给numpy,首先你需要在foo.h文件中定义C++函数:

void foo(double* array, int length);

然后SWIG文件中相关的部分是:

%include "numpy.i"

%init %{
import_array();
%}

%apply (unsigned char* IN_ARRAY1, int DIM1) {(unsigned char* frame, int len)};

%include "foo.h"

问题是,当C++函数是这样的时,你该怎么做:

void bar(double (&array)[3]);

1 个回答

1

这是指一个包含3个双精度浮点数的数组,对吧?根据34.3.9 指针、引用、值和数组的内容,你应该可以直接使用它。

如果不行,你可以试试34.9.4 将Python元组映射到小数组,或者后面的部分。或者在你的问题中提供更多细节,说明你希望编写什么样的Python代码,以及如果让SWIG直接导出bar()函数而不使用类型映射,你需要写什么代码。

更新:你也可以尝试使用%extend或%inline来创建一个适配器函数,转发到数组版本,类似于:

%inline %{
    void bar(double* array, int length) {
         typedef double triplet[3]; // array of 3 doubles
         bar((triplet&)array); // shouldselect your bar since only one arg
    }
%}

警告:未测试哦;)

撰写回答