Python 如何在cython中声明全局numpy.ndarray?

Python 如何在cython中声明全局numpy.ndarray?,python,numpy,global-variables,cython,Python,Numpy,Global Variables,Cython,我想创建一个信号处理算法,它需要在numpy数组中保存一些内部状态 对于速度,我用cython对其进行了编码,并将状态声明为全局变量,如下所示: import numpy as np cimport numpy as np cdef np.ndarray delay_buffer 然而,我真正想做的是: import numpy as np cimport numpy as np DTYPE = np.float32 ctypedef np.float32_t DTYPE_t cdef np

我想创建一个信号处理算法,它需要在numpy数组中保存一些内部状态

对于速度,我用cython对其进行了编码,并将状态声明为全局变量,如下所示:

import numpy as np
cimport numpy  as np
cdef np.ndarray delay_buffer
然而,我真正想做的是:

import numpy as np
cimport numpy as np
DTYPE = np.float32
ctypedef np.float32_t DTYPE_t
cdef np.ndarray[DTYPE_t] delay_buffer
这我可以在其他任何地方做,但不能在全局范围内做。有没有办法做到这一点

有没有办法做到这一点

否。正如错误所述,
缓冲区类型仅允许作为函数局部变量

一种替代方法是使用单片
main
函数。这实际上只需要缩进所有内容,但这意味着你只能分享这么多

我最喜欢的选择是升级到使用MemoryView的现代方法:

cdef DTYPE_t[:] delay_buffer

内存视图应该更快、更干净、功能更强大。

嗯,MemoryView没有诸如shape()、max()等ndarray方法。通常,最好在非类型化数据上使用Python函数,以降低开销。然后您会有类似于
delay\u buffer=delay\u array=…
的内容,其中
delay\u array
是非类型化的。但我也经常建议将像
max
这样的循环展开到内联Cython函数中,因为开销通常要低得多内存视图也有一个
形状
属性最后,在瓶颈场景之外,您可以运行
np.max(memoryview)
,这使得非复制Numpy数组具有很高的恒定开销,但看起来几乎一样漂亮。非常感谢Veedrac!很抱歉,由于我的无知,我发布了我的观点-我不知道MemoryView也有一个形状属性。此外,要归功于@JoshAdel,MemoryView也可以强制为np.ndarray。