Python 键入的memoryview不允许在

Python 键入的memoryview不允许在,python,c,cython,Python,C,Cython,我有一个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。不明白为什么?…此处不允许使用cdef。不明白为什么 简单的回答是,您可能会遇到一

我有一个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。不明白为什么?

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

简单的回答是,您可能会遇到一个与Python和C具有不同范围规则这一事实相关的范围问题

…当您对作用域中的变量进行赋值时,Python会自动将该变量视为该作用域的局部变量,并在任何外部作用域中隐藏任何类似命名的变量

(读#4)


另外,对范围差异等进行一些小讨论。

您试图动态地进行类型声明,但是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 array,并允许cython将其视为动态类型化的python对象