在Cython

时间:2017-05-11 20:16:47

标签: cython

我使用cython与使用复数的外部库进行交互。根据库的配置方式,它们可以是64位或128位复数。例如,对于可变大小的整数,我可以这样做:

cdef extern from "my_header.h":
    ctypedef int HeaderIntType

允许HeaderIntTypeintlong,具体取决于头文件中的typedef&#d; dd。但是当我尝试

ctypedef complex HeaderComplexType

在我的cdef extern中,我收到一个错误,即不支持复杂的外部typedef。

有没有一种很好的方法来实现我想要的,即根据库的构建方式灵活应用我的复杂类型?

更新

我的目标,以最小的形式,如下:

cdef extern from "my_header.h":
    int c_function(ComplexType* c)

def spam(np.ndarray[ComplexType,mode='c'] a not None):
    c_function(&a[0])

c_function使用ComplexTypemy_header.h类型的参数定义,其中我想处理ComplexType作为64位的typedef' d的情况或128位复杂。所以我不确定融合类型能很好地处理这个问题。有小费吗? (当我天真地尝试使用融合类型时,gcc会抱怨函数__pyx_fuse_0c_function__pyx_fuse_1c_function的隐式声明,因为它试图在我的头文件中找到它们,而那些显然不是&#39 ;那里)。

1 个答案:

答案 0 :(得分:1)

Cython完全为此目的fused types

ctypedef fused ComplexType:
    np.complex64_t
    np.complex128_t

def foo(ComplexType[:,::1] A):
    cdef np.ndarray[ComplexType,ndim=2] B
    print(42)

您可以从python中调用它,如

a=rand(3,3) + rand(3,3)*1j
foo(a)  # complex128 case
a=a.astype(np.complex64)
foo(a) # complex64 case