Cython将double复合体返回到float complex会导致表达式不在纯C中

时间:2018-06-05 05:12:48

标签: python numpy cython cythonize

尝试在Cython中使用complex64_t时遇到问题。这是我简单的cython示例。

cimport numpy as cnp

cdef extern from "complex.h":
    double complex cexp(double complex)

cpdef example():
    cdef float b = 2.0
    cdef cnp.complex64_t temp1
    cdef cnp.complex128_t temp2

    temp1 = cexp(1j * b)
    temp2 = cexp(1j * b)

当我使用以下setup.py

对文件进行cython化时
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
import numpy as np


ext_modules = [
    Extension(
        "bug_example",
        ["bug_example.pyx"],
        include_dirs=[np.get_include()],
    )
]


setup(
    name='bug_example',
    ext_modules=cythonize(ext_modules, annotate=True,
                          compiler_directives={'boundscheck': False})
)

一切都没有问题,但我在包含

的行上得到黄色(不是纯粹的C)
temp1 = cexp(1j * b)

但不是

temp2 = cexp(1j * b)

这似乎是将双复合体返回到浮点复合体的问题。我已经尝试将它显式地转换为浮动复合体,如:

temp1 = <float complex>(cexp(1j * b))

但这并没有什么不同。

有人可以帮我修改我的代码,所以temp1的行不再有黄色而且是纯C.这将允许我在cython中使用openmp。

1 个答案:

答案 0 :(得分:1)

黄色是由__Pyx_CREAL__Pyx_CIMAG引起的,这应该不是问题,但是谁知道......

为了避免它,你必须避免从double转换为float并返回。

例如:

cimport numpy as cnp

#take the float version (cexpf) instead of double-version (cexp)
cdef extern from "complex.h":
     float complex cexpf(float complex)

#1j maps to double complex, so create a float version
cdef float complex float_1j = 1j

cpdef example():
    cdef float b_float = 2.0                              #use float not double
    cdef cnp.complex64_t temp1 = cexpf(float_1j*b_float)  #everything is float