带有 SWIG 未知长度数组的 NumPy C 扩展

Posted

技术标签:

【中文标题】带有 SWIG 未知长度数组的 NumPy C 扩展【英文标题】:NumPy C extension with SWIG unknown length array 【发布时间】:2011-10-28 12:21: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 是事先已知的,但Nab 的长度)是未知的,并且ab 被分配(malloc)在功能。

【问题讨论】:

这只是一个 C 问题吗? Swig 使使用 C++ 中的std::vector 解决问题变得更加容易,即使您最终包装了原始函数。 是的,它完全是一个 C 问题。我已经为这个问题放弃了 SWIG,并手动编写了工作正常的包装器。我可以发布答案,但这并不是这个问题的真正答案,因为我不使用 SWIG。 没有理由因此放弃 SWIG。只是不要使用 SWIG 的类型图(它们非常复杂)。您可以在需要时编写自己的包装器,返回和接收 PyObject* 参数。 SWIG 将识别这些,同时仍处理简单的案例(如 int)。 【参考方案1】:

似乎 SWIG(或任何其他 Python 包装器生成器)无法做到这一点。 我最终手动编写了 Python 包装器,这实际上非常简单,使用 PyArray_SimpleNewPyArray_SimpleNewFromData 创建输出数组。 对于后者,必须格外小心,以免产生内存泄漏。 玩了一会儿,我发现前者结合简单的memcpy 更安全。

【讨论】:

以上是关于带有 SWIG 未知长度数组的 NumPy C 扩展的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:将 2d numpy 数组传递给 C 函数 f(double a[])

通过 SWIG 将简单的 numpy 数组传递给 C

如何使用 SWIG 将 C++ 数组转换为 Python 列表?

SWIG 输入文件和带有 numpy 的向量。使用 % 应用?

swig numpy 多个矩阵和数组输入

使用 SWIG 将 numpy 数组元素(int)传递给 c++ int