swig为python代码生成python包装器-numpy.array()的IN_ARRAY和ARGOUT

问题描述 投票:0回答:1

我正在尝试使用swig4为我的C代码生成一个python包装器。由于我没有任何经验,因此在将numpy数组转换为c数组并从c数组返回numpy数组时遇到了一些问题。

这是我所有代码的存储库: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的整数数组的指针。浮点复数* 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部分是假的,但我不知道该如何匹配。

当我通过执行build.sh文件来构建项目时,创建的包装器如下所示:

def dft(x, X, N):
    return _dft.dft(x, X, N)

[我在这里看到swig无法识别我的%app,因为我希望它看起来像这样

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的类型图如何工作。

感谢您的帮助。

python c numpy swig
1个回答
0
投票

我正在做类似的事情,发现这篇文章没有答案。然后我意识到@schnauzbartS已经解决了它,并且他的代码在他的github(有问题的链接)上,这是一个很好的例子。

[我认为,如果有关如何使用IN_ARRAY1和ARGOUT_ARRAY1键入地图的问题是page,则可能会找到一个简单的示例。

注意:在我意识到来自python的IN_ARRAY必须采用float32而不是64的格式(在我的情况下,它是float数组)之前,我在代码上稍作努力。这一定是因为SWIG仅喜欢float32吗?不知道为什么。我发现的另一件事是ARGOUT_ARRAY always需要整数输入作为数组的大小。因此,从我的python结束,我最终调用了该函数

myswigfunc(outarraysize,inarray,inarray2)

例如,outarraysize用于ARGOUT_ARRAY,其他输入是IN_ARRAY_1和_2。

© www.soinside.com 2019 - 2024. All rights reserved.