我正在尝试使用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的类型图如何工作。
感谢您的帮助。
我正在做类似的事情,发现这篇文章没有答案。然后我意识到@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。