我有一个pyx函数,它将获得一个numpy数组。在运行时间之前,我不知道尺寸。检查起来很容易,但问题是我有一个尺寸为1或2的numpy数组x
。我想检查以设置正确的键入的内存视图:
if len(x.shape>1):
cdef double [:,::1] cview_x = x
else:
cdef double [::1] cview_x = x
但我收到一条错误消息,上面说这里不允许使用cdef。不明白为什么?
您试图动态地进行类型声明,但Cython和编译器在编译时需要类型声明。编译cython代码时,cython使用您提供的静态类型信息来优化代码。如果类型不是静态的,即在运行时之前不知道类型或维度,cython就不能在编译时包含这些信息。
有两种主要的方法来解决这个问题,一种是为每种可能的类型定义不同的函数,例如:
def myFun1D(double[::1] array):
pass
def myFun2D(double[:, ::1] array):
pass
def foo(array):
cdef double r
if array.ndim == 1:
r = myFun1D(array)
elif array.ndim == 2:
r = myFun2D(array)
第二种选择是简单地不键入declare数组,并允许cython将其视为动态类型的python对象。
。。。这里不允许使用cdef。不明白为什么
简单的答案是,您可能会遇到一个范围问题,该问题与Python和C具有不同的范围规则这一事实有关。
。。。当您对作用域中的变量进行赋值时,Python会自动将该变量视为该作用域的本地变量,并对任何外部作用域中任何名称相似的变量进行阴影处理
从此处(读取#4)
此外,这里对范围差异等进行了小讨论。