类型化的内存视图不允许在里面如果

Typed memoryview not allow inside if

我有一个 pyx 函数,它会得到一个 numpy 数组。我不知道 运行 时间之前的维度。这很容易检查,但问题是我有一个 numpy 数组 x 和 dimesion 1 或 2。我想检查以设置正确的 输入内存视图:

if len(x.shape>1):
   cdef double [:,::1] cview_x = x
else:
   cdef double [::1] cview_x = x

但是我收到一条错误消息,提示此处不允许使用 cdef。不明白为什么?

...此处不允许使用 cdef。不明白为什么?

简短的回答是,您可能 运行 遇到与 Python 和 C 具有不同范围规则的事实相关的范围问题。

...当您对范围内的变量进行赋值时,Python 会自动认为该变量是该范围的局部变量,并隐藏任何范围内任何类似命名的变量外部范围。

From here(阅读#4)

此外,关于范围差异等的小讨论here

您正在尝试动态进行类型声明,但 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)

第二个选项是简单地不类型声明数组,并允许 cython 将其视为动态类型的 python 对象。