swig сгенерировал оболочку Python для кода c - IN_ARRAY и ARGOUT из numpy.array () - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь сгенерировать оболочку 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 в одной функции.

Спасибо за вашу помощь.

...