gpt4 book ai didi

python - SWIG 输入文件和带有 numpy 的 vector 。使用%申请?

转载 作者:行者123 更新时间:2023-11-30 05:38:33 25 4
gpt4 key购买 nike

我正在尝试让我的 C++ 代码使用 Swig 传递一个 numpy 数组。一切都设置得很好,但是当我通过 python 运行我的代码时,我得到了一个 SwigPyObject。我似乎想不出正确的 SWIG 输入文件。我的函数如下所示:

    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"

它似乎理解 vector ,但输出(应该是 3D 数组)作为 SwigPyObject 出现。

如果这样可以简化问题,我可以将输出设为 3D vector :)

感谢您的帮助!克里斯蒂娜

最佳答案

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

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 确保在 Python 中删除相应的 NumPy 数组时,分配的数据也被删除。使用模板,这可以变得非常紧凑,但是您需要为每个模板实例化一个类型映射。

# 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 执行最后一个脚本生成准备好测试功能的库

关于python - SWIG 输入文件和带有 numpy 的 vector 。使用%申请?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32701212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com