如何将复数从python numpy传递到c(目前正在尝试使用SWIG)

2024-10-03 19:24:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用复杂编号的输入和python调用c编写的函数。我曾尝试使用SWIG生成包装器,但它似乎失败了。我想我需要找出一个合适的“宏”来用在numpy中。我-但不确定它是什么-任何人在这方面有任何经验-或其他方式我可以解决这个问题?在

numpy。我在底部显示了这个-虽然它已经被注释掉了。我尝试使用这些宏,但它们失败了,SWIG抱怨我尝试的以下宏扩展的语法错误:

%numpy_typemaps(complex float, NPY_CFLOAT , int)
%numpy_typemaps(complex double, NPY_CDOUBLE, int)
%numpy_typemaps(complex long double, NPY_CLONGDOUBLE, int)

这些是我的档案:

复数.c

^{pr2}$

复数。i:

%{
#define SWIG_FILE_WITH_INIT
%}
%include "numpy.i"
%init %{
import_array();
%}


%module ComplexNumbers

%inline %{
extern double complex returnX(double complex X);
%}

Python:

#!/usr/bin/env python

"""
setup.py file for ComplexNumbers
"""

from distutils.core import setup
from distutils.extension import Extension

import numpy


ComplexNumbers_module = Extension('_ComplexNumbers',
                           sources=['ComplexNumbers_wrap.c', 
                                    'ComplexNumbers.c'],
                           include_dirs=[numpy.get_include()]
                           )

setup (name = 'ComplexNumbers',
       version = '1.0',
       author      = "JP Hadden jp.hadden@bristol.ac.uk",
       description = """Spectral Interfereometry functions""",
       ext_modules = [ComplexNumbers_module],
       py_modules = ["ComplexNumbers"],
       )

编译器的错误输出

C:\MinGW32-xy\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python27\lib\site-pack
ages\numpy\core\include -IC:\Python27\include -IC:\Python27\PC -c ComplexNumbers
_wrap.c -o build\temp.win32-2.7\Release\complexnumbers_wrap.o
ComplexNumbers_wrap.c:2975:23: error: expected '=', ',', ';', 'asm' or '__attrib
ute__' before 'returnX'
ComplexNumbers_wrap.c: In function '_wrap_returnX':
ComplexNumbers_wrap.c:2982:18: error: expected '=', ',', ';', 'asm' or '__attrib
ute__' before 'arg1'
ComplexNumbers_wrap.c:2982:18: error: 'arg1' undeclared (first use in this funct
ion)
ComplexNumbers_wrap.c:2982:18: note: each undeclared identifier is reported only
 once for each function it appears in
ComplexNumbers_wrap.c:2986:18: error: expected '=', ',', ';', 'asm' or '__attrib
ute__' before 'result'
ComplexNumbers_wrap.c:2986:18: error: 'result' undeclared (first use in this fun
ction)
ComplexNumbers_wrap.c:2997:24: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:2997:24: error: pointer value used where a floating point
value was expected
ComplexNumbers_wrap.c:2997:14: error: invalid type argument of unary '*' (have '
double')
ComplexNumbers_wrap.c:3000:20: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3000:20: warning: implicit declaration of function 'return
X'
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: pointer value used where a floating point
value was expected
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: incompatible type for argument 1 of 'memcp
y'
c:\mingw32-xy\bin\../lib/gcc/mingw32/4.5.2/../../../../include/string.h:38:40: n
ote: expected 'void *' but argument is of type 'double'
error: command 'gcc' failed with exit status 1

Tags: ofimportnumpyincludevalueerrorswigexpected
1条回答
网友
1楼 · 发布于 2024-10-03 19:24:33

我不确定这是如何与Numpy交互的,但是SWIG当然包括对C99复杂类型的支持。我用下面的例子验证了这一点:

%module test
%{
#include <complex.h>
%}

%include <complex.i>

%inline %{
  double complex test(double complex X) {
    return X;
  }
%}

这使用SWIG complex.i接口。在

{{1{1}用来定义一个

我在Linux上编译了这个文件:

^{pr2}$

只需要一个警告就可以了。一旦完成,我就可以:

^{3}$

它似乎接受并返回原生Python复杂类型。在

我还能够编译以下接口:

%{
#define SWIG_FILE_WITH_INIT
#include <complex.h>
%}
%include <complex.i>
%include <numpy.i>
%init %{
import_array();
%}

%numpy_typemaps(complex float, NPY_CFLOAT , int)
%numpy_typemaps(complex double, NPY_CDOUBLE, int)
%numpy_typemaps(complex long double, NPY_CLONGDOUBLE, int)

%module test

%inline %{
  double complex test(double complex X) {
    return X;
  }
%}

%include <complex.i>和{}添加到编译器标志中。我想您可以使用类似these options的方法为您设置distutils。在

相关问题 更多 >