Я пытаюсь написать фрагмент кода в C++, который может создать массив и вернуть его как список Python. Я понимаю, что я могу вернуть список в виде массива NumPy, используя typemaps в numpy.i, но NumPy не установлен на некоторых из кластеров, которые я использую. Основное различие между этим вопросом и некоторыми подобными, которые я видел здесь, это то, что я хочу вернуть массив C переменной длины в виде списка Python.
Урезанная C++ процедура приведена ниже:
/* File get_rand_list.cpp */
#include "get_rand_list.h"
/* Define function implementation */
double* get_rand_list(int length) {
output_list = new double[length];
/* Populate input NumPy array with random numbers */
for (int i=0; i < length; i++)
output_list[i] = ((double) rand()) / RAND_MAX;
return output_list;
}
Я хотел бы иметь возможность использовать это в Python так:
from get_rand_list import *
list = get_rand_list(10)
Который вернет список Python из 10 случайных поплавков. Как я могу использовать шаблоны типов SWIG для обертки C++ для этого? Если есть более простой способ, требующий небольших изменений в C++, который, скорее всего, будет прекрасен.
Поскольку вы используете C++, проще всего использовать STL: SWIG знает, как преобразовать std :: vector в список Python, поэтому используйте
std::vector<double> get_rand_list(int length) { ... }
Не забудьте указать% import std_vector.i. Этот трюк очень полезен в целом, см. Раздел "Библиотека" документов SWIG для других типов, предварительно написанных. Всегда предпочитайте заранее написанные типовые примеры, чтобы сделать свой собственный.
На этот вопрос уже несколько раз ответили