2017-01-23 90 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