У меня есть библиотека C ++, которая определяет следующие (и более похожие на них) типы:
typedef std::vector< double > DoubleVec;
typedef std::vector< DoubleVec > DoubleVecVec;
typedef std::vector< int > IntVec;
typedef std::vector< IntVec > IntVecVec;
Я пытаюсь создать интерфейс Python для библиотеки, которая обрабатывает подобные объекты. Как гласит заголовок, я бы хотел, чтобы мой интерфейс конвертировался в / из C ++ std::vector
и NumPy ndarray
,
Я видел оба numpy.i
обеспеченный numpy людьми и std_vector.i
от людей SWIG. Проблемы в том, что numpy.i
был создан для обработки массивов C / C ++ (не векторов C ++) и std_vector.i
не выполняет преобразование напрямую в / из массива numpy.
Есть идеи?
Я видел, что FENICS Проект сделал что-то вроде этого, но их проект настолько велик, что мне трудно понять, как они выполняют эту конкретную задачу.
Попробуйте это как отправную точку.
%include "numpy.i"
%apply (size_t DIM1, double* IN_ARRAY1) {(size_t len_, double* vec_)}
%rename (foo) my_foo;
%inline %{
int my_foo(size_t len_, double* vec_) {
std::vector<double> v;
v.insert(v.end(), vec_, vec_ + len_);
return foo(v);
}
%}
%apply (size_t DIM1, size_t DIM2, double* IN_ARRAY2) {(size_t len1_, size_t len2_, double* vec_)}
%rename (bar) my_bar;
%inline %{
int my_bar(size_t len1_, size_t len2_, double* vec_) {
std::vector< std::vector<double> > v (len1_);
for (size_t i = 0; i < len1_; ++i) {
v[i].insert(v[i].end(), vec_ + i*len2_, vec_ + (i+1)*len2_);
}
return bar(v);
}
%}
Других решений пока нет …