我使用cython与使用复数的外部库进行交互。根据库的配置方式,它们可以是64位或128位复数。例如,对于可变大小的整数,我可以这样做:
cdef extern from "my_header.h":
ctypedef int HeaderIntType
允许HeaderIntType
为int
或long
,具体取决于头文件中的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
使用ComplexType
中my_header.h
类型的参数定义,其中我想处理ComplexType
作为64位的typedef' d的情况或128位复杂。所以我不确定融合类型能很好地处理这个问题。有小费吗? (当我天真地尝试使用融合类型时,gcc会抱怨函数__pyx_fuse_0c_function
和__pyx_fuse_1c_function
的隐式声明,因为它试图在我的头文件中找到它们,而那些显然不是&#39 ;那里)。
答案 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