2015-09-21 21 views
0

我想讓我的C++代碼使用Swig提供一個numpy數組。一切都很好設置,但是當我通過python運行我的代碼時,我得到一個SwigPyObject。我似乎無法拿出正確的SWIG輸入文件。我的功能看起來是這樣的:SWIG輸入文件和具有numpy的向量。使用%申請?

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

我的.i文件看起來是這樣的:

%module runshapes 
%{ 
#define SWIG_FILE_WITH_INIT 
#include "runshapes.h" 
%} 
%include "numpy.i" 

%init %{ 
import_array(); 
%} 

%include "std_vector.i" 
%include "std_string.i" 
// Instantiate templates used by example 

namespace std { 
    %template(DoubleVector) vector<double>; 
    %template(VecVecdouble) vector< vector<double> >; 
    %template(VecVecVecdouble) vector< vector< vector<double> > >; 
} 

%include "runshapes.h" 

它似乎明白了矢量,但輸出(應該是一個三維數組)出來的SwigPyObject。

我可以使輸出端的三維矢量如果它簡化了問題:)

感謝您的幫助! Christina

+0

嘿,@Christina。使用'std :: vector'你總是會複製數據,不可能使用指針創建'std :: vector'而不復制。我通常使用'llvm'中的'ArrayRef'或者爲std :: vector創建一個包裝器,並使用'numpy.i'中的傳統方法來進行swigging。如果你喜歡,我可以爲此發佈解決方案。它非常整齊 –

回答

0

我通常使用Pum類型使用NumPy類型映射來包裝接口,如下所示。

vector3.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); 

vector3.cpp

#include "vector3.h" 

#include <stdio.h> 
#include <malloc.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) { 
    // Note this one allocates 
    size_t nx = 10; 
    size_t ny = 20; 
    size_t nz = 30; 

    *odata = (double*) malloc(sizeof(double)*nx*ny*nz); 
    *onx = nx; 
    *ony = ny; 
    *onz = nz; 

    // Do whatever 
    printf("inx,iny,inz: %zu, %zu, %zu\n",nx,ny,nz); 
    return 0; 
} 

vector3.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" 

注意,類型映射ARGOUTVIEWM_ARRAY3確保分配的數據被刪除時,相應NumPy的陣列在Python中被刪除。使用模板,可以使其非常緊湊,但您需要每個模板實例化的類型圖。

# 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最後腳本生成庫準備測試功能