使用numpy.i从SWIG方法返回numpy矩阵

使用numpy.i从SWIG方法返回numpy矩阵,numpy,swig,Numpy,Swig,我在文档中发现了以下SWIG规则 ( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] ) 坦白地说,这个代码片段不知道如何包装一个返回3×3矩阵的C++函数。“任何”是什么意思?假设我有一个函数,它的签名是void make\u矩阵(double**matrix)。它使用malloc()分配3*3*sizeof(double)字节,并将它们写入out参数。现在应用这个规则?如何将3绑定到“ANY”?如何将矩阵绑定到“ARGOUT_ARRAY2”?如何将数据类型绑定到

我在文档中发现了以下SWIG规则

    ( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )

坦白地说,这个代码片段不知道如何包装一个返回3×3矩阵的C++函数。“任何”是什么意思?假设我有一个函数,它的签名是

void make\u矩阵(double**matrix)
。它使用malloc()分配
3*3*sizeof(double)
字节,并将它们写入out参数。现在应用这个规则?如何将3绑定到“ANY”?如何将矩阵绑定到“ARGOUT_ARRAY2”?如何将数据类型绑定到double?是否有任何类型的文档涵盖这些详细信息?

基于您引用的文档(在本节中):

列出的第一个签名,
(数组[ANY]中的数据类型)
用于具有硬编码维度的一维数组。同样地,
(数组中的数据类型[ANY][ANY])
适用于硬编码维度的二维数组,同样适用于三维数组


“全部大写”部分是实际使用的值的占位符。正确使用取决于对SWIG语法的深入理解。

< P>如果你恰巧使用了可尊敬的库来表示C++中的矩阵,那么在其中允许使用代码> > EGEN < /C>矩阵可以透明地转换成<代码> NoMPy数组。 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();
%模块(docstring=“简单SWIG+Eigen演示”)myeigenswig
%包括eigen.i
%包括numpy.i
%{
#使用_INIT定义SWIG_文件
#包括
#包括“mylibrary.hpp”
%}
%初始%{
导入数组();
%}
%特征类型映射(特征::向量xd)
%特征类型映射(特征::矩阵XXD)
特征::矩阵XXD myFunction();

另一个选项,如果你不使用本征,就是把你的3x3 C++数组转换成一个9元素<代码> STD::vector ,Sigg很容易转换成Python列表,然后通过调用<代码> NoMPy.as数组(VECRTROFROMCXX)。这将不是特别有效,涉及到不同数据结构之间的相当多的复制,但是对于您的应用程序来说可能是足够的,除非您在C++和Python之间传递许多矩阵。实际上,我正在寻找一个通过使用NUMPY.I的输出参数返回固定大小数组的单个片段。目前,我几乎放弃了使用自定义映射,该映射使用硬编码参数调用PyArray_SimpleNew。