2012-08-31 47 views
3

我想創建一個信號處理算法,需要在numpy數組中保存一些內部狀態。如何在cython中聲明全局numpy.ndarray?

對於速度,我的編碼,在用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 

這是我可以做其他任何事情,但不在全球範圍內。有什麼辦法可以做到這一點?

回答

1

有什麼辦法可以做到這一點?

否如錯誤所示,Buffer types only allowed as function local variables

一種替代方案是使用單片功能。這實際上只是縮小一切,但這意味着你只能分享這麼多。

我最喜歡的替代方法是升級到使用memoryviews的現代方法:

cdef DTYPE_t[:] delay_buffer 

的應該是更快,更清潔,沒有那麼強大。

+0

好吧,memoryviews沒有ndarray方法,如shape(),max()等。 –

+2

*通常*最好在非類型化數據上使用Python函數以降低開銷。然後你會得到'delay_buffer = delay_array = ...'這樣的''delay_array'是無類型的。但我也經常建議展開像'max'這樣的循環到內聯的Cython函數中,因爲開銷通常較低。 //還有memoryviews * do *有一個'shape'屬性。 //最後,在瓶頸情況之外,你可以運行'np.max(memoryview)'來製作一個非複製的Numpy數組,因此具有很高的持續開銷,但看起來幾乎一樣漂亮。 – Veedrac

+0

非常感謝Veedrac!我很抱歉,由於我的無知,我發表了自己的觀點 - 我不知道記憶體視覺也有一個形狀屬性。並且,可以認爲@JoshAdel,memoryviews也可以強制np.ndarray。 http://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpy –