Python 键入的memoryview不允许在
我有一个pyx函数,它将得到一个numpy数组。在运行前我不知道尺寸。这很容易检查,但问题是我有一个尺寸为1或2的numpy数组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。不明白为什么 简单的回答是,您可能会遇到一
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对象