Я пытаюсь сгенерировать оболочку Python для своего кода на C с помощью swig4.Поскольку у меня нет никакого опыта, у меня возникают некоторые проблемы с преобразованием массива numpy в массив ac и возвращением массива numpy из массива ac.
Вот мой репозиторий со всем моим кодом: https://github.com/FelixWeichselgartner/SimpleDFT
void dft(int *x, float complex *X, int N) {
X = malloc(N * sizeof(float complex));
float complex wExponent = -2 * I * pi / N;
float complex temp;
for (int l = 0; l < N; l++) {
temp = 0 + 0 * I;
for (int k = 0; k < N; k++) {
temp = x[k] * cexp(wExponent * k * l) + temp;
}
X[l] = temp/N;
}
}
Вот так выглядит моя C-функция.int * x - указатель на массив целых чисел с длиной N. float complex * X будет выделен функцией dft с длиной N.
/* File: dft.i */
%module dft
%{
#define SWIG_FILE_WITH_INIT
#include "dft.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (int * IN_ARRAY1, int DIM1) {(int *x, int N)}
%apply (float complex * ARGOUT_ARRAY1, int DIM1) {(float complex *X, int N)}
%include "dft.h"
Так выглядит мой файл swig.Я предполагаю, что часть% apply в конце имеет значение false, но я не знаю, как это сопоставить.
Когда я строю свой проект, выполняя мой файл build.sh, созданная оболочка выглядит так:
def dft(x, X, N):
return _dft.dft(x, X, N)
Здесь я вижу, что swig не распознал мой% apply, так как я хочу, чтобы он выглядел следующим образом
def dft(x):
# N is len(x)
# do some stuff
return X # X is a numpy.array() with len(X) == len(x)
Я хочу использовать его следующим образом:
X = dft(x)
Очевидно, что я получаю эту ошибку, выполнив:
File "example.py", line 12, in <module>
X = dft(x)
TypeError: dft() missing 2 required positional arguments: 'X' and 'N'
Должен ли я написать свою собственную карту типов или я могу использовать numpy.i.И как будет работать карта типов с IN_ARRAY1 и ARGOUT_ARRAY1 в одной функции.
Спасибо за вашу помощь.