python - 类型化的内存 View 不允许在里面如果

标签 python c cython

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

相关文章:

Python GStreamer : getting Meta Api for appsink buffer

python - 聚合具有列表的列作为 pandas 数据框中的值

python - 如何在 Cython 中测试 cdef 函数?

python - Cython 包装器使用 cl.exe (windows) 将 .c 文件编译为 .pyd

python - 将多个子模块折叠为一个 Cython 扩展

python - 检查字符串中的任何字符是否不在另一个字符串中

python - 测试执行 HTTP 请求的 Python 应用

c - 在xcode中添加多个.c文件

c++ - 在 QPixmap 中写入文本

c - 如何通过指针将整数值赋给结构内部的数组