我有一个 pyx 函数,它会得到一个 numpy 数组。我不知道运行时之前的尺寸。这很容易检查,但问题是我有一个带有维度 1 或 2 的 numpy 数组 x
。我想检查以设置正确的
输入内存 View :
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)
第二个选项是简单地不类型声明数组,并允许 cython 将其视为动态类型的 python 对象。
关于python - 类型化的内存 View 不允许在里面如果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34636186/