键入的内存视图不允许在if内部



我有一个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)

此外,这里对范围差异等进行了小讨论。

最新更新