Я изучаю 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, с которым я импортирую (находясь в той же директории) "из np_array_to_array import *", и я могу успешно запустить getMidметод, передавая в numpyArray и получая двойной обратно.Как указано выше, я просто не уверен, действительно ли это передается по указателю (не делает никаких копий) или нет, так как я не нашел ничего, что говорит так или иначе.Может ли кто-нибудь сказать мне, а если нет, объяснить, как можно это сделать?Я полагаю, что это должно быть возможно, поскольку я думаю, что массив numpy использует типы c и хранит память непрерывно, как c.