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

如何将复数从python numpy传递到c(目前正在尝试使用SWIG),python,c,numpy,swig,Python,C,Numpy,Swig,我想用复数输入和python调用c编写的函数。我曾尝试使用SWIG生成包装器,但它似乎失败了。我想我需要制定出适合在numpy中使用的“宏”。我-但不确定它是什么-有人有这方面的经验-或者我可以用其他方法解决这个问题 numpy。我在底部显示了这一点——尽管它已经被注释掉了。我尝试使用这些宏,但失败了,SWIG抱怨我尝试的以下宏扩展出现语法错误: %numpy_typemaps(complex float, NPY_CFLOAT , int) %numpy_typemaps(complex do

我想用复数输入和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)
这些是我的文件:

复合数字

#包括
#包括
双复数X(双复数X)
/*
菲涅耳反射系数
*/
{
返回X;
}
complexNumber.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\u wrap.o
ComplexNumbers_wrap.c:2975:23:错误:应为“=”,“,”,“;”,”asm“或”属性
“returnX”之前的“ute_uuuuuu”
ComplexNumbers\u wrap.c:在函数“\u wrap\u returnX”中:
ComplexNumbers_wrap.c:2982:18:错误:应为“=”,“,”,“;”,”asm“或”属性
“arg1”之前的ute
ComplexNumbers_wrap.c:2982:18:错误:“arg1”未声明(此函数首次使用
离子)
ComplexNumbers\u wrap.c:2982:18:注意:仅报告每个未声明的标识符
每个函数出现一次
ComplexNumbers_wrap.c:2986:18:错误:应为“=”,“,”,“;”,”asm“或”属性
“结果”之前的“结果”
ComplexNumbers_wrap.c:2986:18:error:“result”未声明(首次在本游戏中使用)
(行动)
ComplexNumbers_wrap.c:2997:24:error:expected')在“complex”之前
ComplexNumbers_wrap.c:2997:24:错误:在使用浮点时使用指针值
价值是预期的
ComplexNumbers_wrap.c:2997:14:错误:一元“*”的类型参数无效(have'
双’)
ComplexNumbers_wrap.c:3000:20:error:expected')在“complex”之前
ComplexNumbers_wrap.c:3000:20:警告:函数“return”的隐式声明
X'
ComplexNumbers_wrap.c:3001:15:error:expected')在“complex”之前
ComplexNumbers_wrap.c:3001:15:error:expected')在“complex”之前
ComplexNumbers_wrap.c:3001:15:error:expected')在“complex”之前
ComplexNumbers_wrap.c:3001:15:错误:在使用浮点时使用指针值
价值是预期的
ComplexNumbers_wrap.c:3001:15:error:expected')在“complex”之前
ComplexNumbers_wrap.c:3001:15:错误:“memcp”的参数1的类型不兼容
y'
c:\mingw32 xy\bin\../lib/gcc/mingw32/4.5.2/../../../../../../include/string.h:38:40:n
注意:应为“void*”,但参数的类型为“double”
错误:命令“gcc”失败,退出状态为1

我不确定它如何与Numpy交互,但SWIG肯定包括对C99复杂类型的支持。我通过以下示例验证了这一点:

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

%include <complex.i>

%inline %{
  double complex test(double complex X) {
    return X;
  }
%}
只需一个警告就可以正常运行。完成后,我可以:

LD_LIBRARY_PATH=.  python                       
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.test(complex(0,1))
1j
>>> test.test(complex(0,2))
2j
>>> test.test(complex(1,2))
(1+2j)
>>> 
它似乎接受并返回本机Python复杂类型

我还能够编译以下接口:

%{
#使用_INIT定义SWIG_文件
#包括
%}
%包括
%包括
%初始%{
导入数组();
%}
%numpy_类型映射(复数浮点、NPY_CFLOAT、int)
%numpy_类型映射(复数双精度、NPY_双精度、整数)
%numpy_类型映射(复杂长双精度、NPY_CLONGDOUBLE、int)
%模块测试
%内联%{
双复测试(双复X){
返回X;
}
%}

在编译器标志中添加
%include
-std=c99
。我认为您可以使用类似的方法设置distutils。

编译器的输出看起来没有显式启用C99模式-我认为默认值(仍然)是gnu89。编译器调用上的
-std=c99
是否会清除一些问题?另外,您拥有的
%inline
是不必要的复杂-您可以只执行
双复数返回X(双复数X)
而不是
%inline
或仅
%include“ComplexNumbers.h”
(如果您有这样的头文件)。感谢您的帮助……我的代码现在可以正常工作了。对于那些感兴趣的人。。。重要的是,我不确定编译器标志有什么影响,但它可以处理复杂的include%{include%}%include