使用numpy.i

时间:2018-04-12 11:12:58

标签: numpy swig

我在numpy.i文档中找到了以下SWIG规则。

    ( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )

坦率地说,这个片段不知道如何包装返回3 * 3矩阵的C ++函数。 “任何”是什么意思?假设,我有一个带有签名void make_matrix(double** matrix)的函数。它使用malloc()分配3*3*sizeof(double)个字节,并将它们写入out参数。现在应用这个规则?如何将3绑定到“任何”?如何将矩阵绑定到“ARGOUT_ARRAY2”?如何绑定DATA_TYPE加倍?是否有任何文件涵盖这些细节?

2 个答案:

答案 0 :(得分:0)

根据您引用的文档(在Input Arrays部分中):

  

列出的第一个签名( DATA_TYPE IN_ARRAY[ANY] )用于具有硬编码维度的一维数组。同样,( DATA_TYPE IN_ARRAY2[ANY][ANY] )用于具有硬编码维度的二维数组,对于三维也是如此。

全部大写部分是您实际使用的值的占位符。正确使用取决于对SWIG语法的透彻理解。

答案 1 :(得分:0)

如果您碰巧使用古老的Eigen库来表示C ++中的矩阵,那么wrappers中有一些非常有用的SWIG Biomechanical Toolkit允许Eigen将矩阵透明地转换为numpy数组。

您的SWIG界面定义应包含以下内容:

%module(docstring="Simple SWIG+Eigen demo") myeigenswig
%include eigen.i
%include numpy.i

%{
#define SWIG_FILE_WITH_INIT
#include <Eigen/Core>
#include "mylibrary.hpp"
%}

%init %{
import_array();
%}

%eigen_typemaps(Eigen::VectorXd)
%eigen_typemaps(Eigen::MatrixXd)

Eigen::MatrixXd myFunction();

另一个选择,如果你不使用Eigen,就是将你的3x3 C ++数组转换为9个元素std::vector<double>,SWIG可以很容易地转换成Python列表,然后可以转换为通过调用numpy.asarray(vectorFromCxx).reshape((3,3))来获取numpy数组。这将不是特别有效,涉及在不同数据结构之间进行相当多的复制,但对于您的应用程序可能已经足够了,除非您在C ++和C ++之间传递了许多矩阵。蟒。