【发布时间】:2019-06-19 20:22:48
【问题描述】:
我正在为我工作的实验室学习 C++、swig 和 numpy。已指定我必须使用 swig(没有 scypy),我必须使用 numpy 数组,并且我不能“将 C 代码带入python 世界”,例如在我的接口文件中使用 %import "std_vector" 并让 python 用户创建一个来发送。话虽如此,我正在尝试获得一个 1d numpy 数组(如果他们需要更多维度,我会只需将其展平)以专门通过指针传递到我的 C 代码中——我的老板不想花时间复制所有内容,因为效率非常重要。我相信我们使用 c++ 14、python 2.7 和最新版本的 swig,我也在使用 numpy.i。
我将在下面提供我目前正在使用的代码(只是试图在这里获得一个最小可行的代码)但我很新,虽然它确实有效,但我不确定它实际上是在传递一个指针而不是复制任何我想要的东西。有人可以确认它是,还是告诉我如何做到这一点?谢谢 x10^99
//The C++ file I am wrapping:
#ifndef _np_array_to_array_h
#define _np_array_to_array_h
using namespace std;
double getMid(double* myArray, int size){
int half = size / 2;
return myArray[half];
}
#endif
///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\//\/\
//The interface file:
%module np_array_to_array
%{
#define SWIG_FILE_WITH_INIT
#include "np_array_to_array.h"
#include <numpy/arrayobject.h>
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (double* IN_ARRAY1, int DIM1){(double* myArray, int size)};
%include "np_array_to_array.h"
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
//How I compile on terminal:
swig -python -c++ np_array_to_array.i
g++ -fpic -c np_array_to_array_wrap.cxx -I/usr/include/python2.7
-I/home/sean/Desktop/SerangLab/Swig/numpy/numpy/core/include/ -I/home/sean/.local/lib/python2.7/site-packages/numpy/core/include/numpy/
g++ -shared np_array_to_array_wrap.o -o _np_array_to_array.so
这将编译并运行,并创建一个成功运行的 python 模块,我使用“from np_array_to_array import *”导入(当在同一目录中时)我可以成功运行 getMid 方法,传入一个 numpyArray 并获得一个 double退出。如上所述,我只是不确定这是否实际上是通过指针传递(不制作任何副本),因为我没有找到任何可以说明这种方式的东西。有人可以告诉我,如果不是,请解释如何做到这一点?我相信这应该是可能的,因为我认为 numpy 数组使用 c 类型并像 c 一样连续存储内存。
【问题讨论】:
标签: python c++ numpy swig numpy-ndarray