Расширение NumPy C с массивом неизвестной длины SWIG - PullRequest
4 голосов
/ 28 октября 2011

Я бы хотел обернуть функцию C с помощью SWIG. Функция принимает пару массивов (одинаковой длины) в качестве входных данных и возвращает еще три массива. Однако невозможно заранее предсказать длину возвращаемых массивов, и они динамически распределяются в функции. Можно ли обернуть такую ​​функцию SWIG (используя numpy.i) и если да, то как? Упрощенное объявление функции выглядит так:

int func(double **a, double **b, long int *N, double *x, double *y, long int *Nx, long int *Ny);

Где Nx и Ny известны заранее, но N (длина a и b) - нет, а a и b выделяются (с malloc) в функция.

1 Ответ

1 голос
/ 05 декабря 2011

Кажется, что SWIG (или любой другой генератор оболочки Python в этом отношении) не может этого сделать. В итоге я написал оболочку Python вручную, что на самом деле довольно просто, используя PyArray_SimpleNew или PyArray_SimpleNewFromData для создания выходных массивов. С последним нужно быть особенно осторожным, чтобы не вызвать утечек памяти. Немного поиграв с ним, я обнаружил, что первое в сочетании с простым memcpy безопаснее.

...