用numpy交换输入文件和向量。使用%apply?

2024-09-24 02:13:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让我的C++代码使用SWIG来传递一个NUMPY数组。但是当我设置好python代码时,我可以很好地运行我的代码。我好像找不到正确的SWIG输入文件。我的功能如下:

    double*** runshapes(vector<vector<vector<double> > > &array3d,
            double T,
            double lam,
            double Vel){...}

我的.i文件如下:

^{pr2}$

它似乎能理解向量,但输出(应该是一个3D数组)是SwigPyObject。在

如果能简化问题的话,我可以把输出变成三维矢量:)

谢谢你的帮助! 克里斯蒂娜


Tags: 文件代码功能numpy数组向量swigdouble
1条回答
网友
1楼 · 发布于 2024-09-24 02:13:51

我通常使用POD类型使用NumPy类型映射包装接口,如下所示。在

向量3.h

#pragma once

#include <stddef.h>

int runshapes_wrap(const double* idata,
                   const size_t inx,
                   const size_t iny,
                   const size_t inz,
                   double** odata,
                   size_t* onx,
                   size_t* ony,
                   size_t* onz);

向量3.cpp

^{pr2}$

向量3.i

%module(docstring="This is a Python wrapper for Sofus") swig_vector
%{
  #define SWIG_FILE_WITH_INIT  
  #include "vector3.h"
%}

%include "numpy.i"

%init
%{
  import_array();
%}

%apply (double** ARGOUTVIEWM_ARRAY3, size_t* DIM1, size_t* DIM2, size_t* DIM3) {(double** odata, size_t* onx, size_t* ony, size_t* onz)}

%apply (double* IN_ARRAY3, int DIM1, int DIM2, int DIM3) {(const double* idata, const size_t inx, const size_t iny, const size_t inz)};

%include "vector3.h"

请注意,typemap ARGOUTVIEWM_ARRAY3确保在Python中删除相应的NumPy数组时删除分配的数据。使用模板,这可以变得非常紧凑,但是每个模板实例化都需要一个typemap。在

# setup.py

from distutils.core import setup, Extension

setup(name="swig_vector",
      py_modules=['swig_vector'],
      ext_modules=[Extension("_swig_vector",
                     ["vector3.i", "vector3.cpp"],
                     swig_opts=['-c++'],
    extra_compile_args=[' std=c++11']
                  )]

)

使用python setup.py build_ext inplace执行最后一个脚本将生成准备好测试功能的库

相关问题 更多 >