2017-01-23 84 views
0

說我有幾個陣列,可能大小不同的:聲明numpy的陣列的列表/矢量/陣列在用Cython

A0 = rand(3,3) 
A1 = rand(4,4) 

在用Cython,我可以聲明它們的類型得到快速項目訪問:

cdef np.ndarray[double, ndim=2] A0 
cdef np.ndarray[double, ndim=2] A1 

不過,說我要通過索引來訪問它們:

A = (A0,A1) 
A[0][2,1] += A[1][1,0] 

不過,現在用Cython不知道的類型和A[1],這使訪問變慢。我不認爲Cython具有「類型元組」的概念。那麼我怎麼能聲明A(或類似的對象),以便我仍然可以在上述表達式中快速訪問項目?

+1

我懷疑最好的辦法就是將它們連接成一個三維陣列和零(或南)墊在大小不匹配的地方。我想不出明顯的更好的方式(但這並不意味着它不存在!) – DavidW

回答

0

這是否是有效cython是投機性的,但靈感來自cython例如在結束:

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#putting-the-inner-loop-in-cython

我建議:

cdef foo(aTuple): 
    cdef np.ndarray[double, ndim=2] A0 
    cdef np.ndarray[double, ndim=2] A1 
    A0, A1 = aTuple # use unpacking 
    A0[2,1] += A1[1,0]  

https://github.com/cython/cython/blob/master/tests/run/unpack.pyx - 是解壓測試pyx

也許使用A0 = aTuple[0]A1 = aTuple[1];這個想法是使用數組鍵入它重要的地方,用於它自己的索引。該元組只保存指針,所以打字無關緊要。

cython使用數組時,另一個有用的頁面是http://cython.readthedocs.io/en/latest/src/userguide/memoryviews.html

+0

我不認爲這有助於如果我想用'A [k]'這樣的東西,比如說在'k'上循環? – cfh

+0

甚至沒有用'for a0 in aTuple:'或'A0 = aTuple [k]'? – hpaulj

+1

錯過了這一點;這意味着我每次想訪問它時都必須將通用Python對象的拆箱成本支付給「ndarray」,這正是我想要避免的。 – cfh