使用SWIG的NumPy C扩展未知长度数组

4 投票
1 回答
517 浏览
提问于 2025-04-17 05:11

我想用SWIG来封装一个C语言的函数。这个函数接收几个数组(长度相同)作为输入,并返回三个新的数组。不过,返回数组的长度是无法提前预测的,这些数组是在函数内部动态分配的。请问,使用SWIG(通过numpy.i)来封装这样的函数可行吗?如果可以的话,应该怎么做呢?

int func(double **a, double **b, long int *N, double *x, double *y, long int *Nx, long int *Ny);

在这里,NxNy是事先已知的,但N(也就是数组ab的长度)是不确定的,而ab是在函数内部用malloc分配的。

1 个回答

1

看起来SWIG(或者其他任何Python包装生成器)都无法做到这一点。最后我还是手动写了Python的包装,这其实挺简单的,可以使用PyArray_SimpleNew或者PyArray_SimpleNewFromData来创建输出数组。使用后者的时候需要特别小心,以免造成内存泄漏。在尝试了一段时间后,我发现前者结合简单的memcpy会更安全一些。

撰写回答