2017-07-19 22 views
1

我無法找到任何地方的任何文檔,專門用於解決此:如何使用@cython裝飾聲明np.ndarray型

下面的代碼:

cdef int foo(double data): 
    # ... 
    return int(data) 

可以寫爲:

@cython.returns(cython.int) 
@cython.locals(data=cython.double) 
def foo(data): 
    return int(data) 

但我無法找到一個同等聲明:

cdef foo(np.ndarray[double] data): 

使用@ cython.locals導致編譯錯誤。

裝飾者在cython中聲明一個numpy數組的正確方法是什麼?

+0

您可以使用記憶體嗎?這些看起來像他們應該工作(例如'@ cython.locals(data = cython.double [:])')並且基本上與ndarray具有相同的功能。 (注意 - 我還沒有完全測試過這個......) – DavidW

+0

@DavidW:我試過那條大道,但無法使它工作。就目前而言,你寫的代碼並不適合我。 (編譯Cython文件時出錯:test.py:31:52:不是類型) –

回答

1

這似乎並沒有被記錄任何地方,但memoryviews被接受爲一個字符串:

@cython.returns(cython.int) 
@cython.locals(data="double[:]") 
def foo(data): 
    return int(data[0]) 

我想這通常工作,但與numpy的陣列面臨的挑戰是,你必須cimport numpy,我認爲這是不可能的純Python代碼。

+0

您對cimport評論是正確的。我認爲你在這裏提出的和你在評論中提出的內容之間的區別在於你使用了字符串文字。這確實有所不同。 我打算把這個標記爲答案,儘管它不完全是答案,但很可能是我們所希望的最好。 –

+0

是的,您對此和我之前的評論之間的區別以及評論中的版本不起作用是正確的。 – DavidW

0

我發現在谷歌論壇的答案如下:

試着做一個mySum功能cpdef裝潢一個在.pxd 文件,使用numpy的數組聲明語法cython.locals。

Google Group

您可以使用.pxd文件和@ cython.locals註解來聲明 緩衝區類型。

Google Group

+0

感謝您的關注。我特別試圖避免使用.pxd文件。 如果我找不到問題的解決方案,我最終不得不去那裏,但這實際上並不是一個解決方案。 現在,@ cython.locals(data = np.ndarray)有效,但不能像cdef方法一樣快...... –