2017-09-15 28 views
2

我有一個cython代碼,其數據(M)和numpy.ndarray的索引(Ixs)需要2d numpy.ndarray。它遍歷Ixs的條目並使用Ixs的值ix來索引M的列。請參見下面的代碼:應該將索引的Cython內存視圖的類型爲Py_ssize_t或int?

def foo(double[:, ::1] M, int[:, ::1] Ixs): 
    cdef int rows = M.shape[0] 
    cdef int cols = M.shape[1] 
    cdef Py_ssize_t c, r 
    for c in range(rows): 
     for r in range(cols): 
      ix = Ixs[c, r] 
      dosomething(M[c, ix]) 

我知道我應該使用Py_ssize_t作爲一個類型的索引(我讀它是爲了配合64位體系結構),但現在我使用類型的內存視圖int ...在這種情況下,我看不到創建Py_ssize_tnumpy.ndarray的方法,因此ixPy_ssize_t

寫這個cython代碼的正確方法是什麼?使用int有什麼問題嗎?

回答

3

有一點要注意,你將要書面將努力確定輸入ix

您的代碼,M[c, ix]會投九從intPy_ssize_t,應該始終是一個安全的轉換。

也就是說,你可以也可能應該讓你的索引器數組爲Py_ssize_t。相應numpy的類型是np.intp

https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html

+0

所以我們可以說,我投它在Python np.intp('IXS = Ixs.atype(np.intp)'),那麼我改寫這個功能:'高清foo(double [:, :: 1] M,Py_ssize_t [:, 1] Ixs):'對嗎? – Gioelelm

+0

是的,儘管理想的'Ixs'在創建時輸入了intp來避免劇組。 – chrisb

+0

當然,但在我的情況下,它將是一個scikit學習函數的輸出。 – Gioelelm

相關問題