2016-01-06 23 views
1

我有一個pyx函數會得到一個numpy數組。運行時間之前我不知道尺寸。這是很容易檢查,但問題是我有一個numpy的陣列x與dimesion 1或2。我想以此來設置正確的 類型memoryview檢查:鍵入的內存視圖不允許在裏面如果

if len(x.shape>1): 
    cdef double [:,::1] cview_x = x 
else: 
    cdef double [::1] cview_x = x 

但我得到一個錯誤信息其中說cdef不允許在這裏。不明白爲什麼?

回答

2

你試着做動態類型聲明,而是由需要的類型聲明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對象。

0

... cdef不允許在這裏。不明白爲什麼?

簡短的回答是,您很可能遇到與Python和C具有不同範圍規則這一事實相關的範圍問題。

...當您對作用域中的變量進行賦值時,Python會自動將該變量視爲該作用域的局部變量,並在任何外部作用域中映射任何具有類似名稱的變量。

From here(讀#4)

此外,小disscussion here範圍上的差異等