2017-01-23 3 views
0

sagen, dass ich mehrere Arrays haben, möglicherweise in verschiedenen Größen:Deklarieren einer Liste/Vektor/Array von numpy Arrays in Cython

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

In Cython ich ihre Typen erklären kann schnell Artikel Zugang zu bekommen:

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

jedoch sagen, dass ich sie durch den Index zugreifen möchten:

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

Doch jetzt Cython kennt nicht die Art von 01.237.und A[1], wodurch der Zugriff langsam wird. Ich glaube nicht, dass Cython das Konzept eines "typisierten Tupels" hat. Also, wie kann ich A (oder ein ähnliches Objekt) deklarieren, so dass ich immer noch schnellen Objektzugriff im obigen Ausdruck bekomme?

+1

Ich vermute, dass der beste Weg, um sie in einen 3D-Array verketten und Null (oder nan) die Orte, Pad, wo die Größen nicht übereinstimmen. Ich kann mir keinen offensichtlich besseren Weg vorstellen (aber das bedeutet nicht, dass es nicht existiert!) – DavidW

Antwort

0

Ob dies gilt cython spekulativ ist, aber inspiriert durch das cython Beispiel am Ende:

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

Ich würde vorschlagen:

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 - ist der Test auspacken pyx.

Oder vielleicht A0 = aTuple[0] und A1 = aTuple[1]; Die Idee ist, das Array für seine eigene Indexierung zu verwenden, wo es wichtig ist. Das Tupel enthält nur Zeiger, so dass die Eingabe keine Rolle spielt.

Eine weitere nützliche Seite, wenn sie mit Arrays in cython Arbeit ist http://cython.readthedocs.io/en/latest/src/userguide/memoryviews.html

+0

Ich denke nicht, dass das hilft, wenn ich etwas wie 'A [k] 'mit, sagen wir, a haben möchte Schleife über 'k'? – cfh

+0

Nicht einmal mit 'für A0 in aTuple:' oder 'A0 = aTuple [k]'? – hpaulj

+1

Das vermisst den Punkt; Das bedeutet, dass ich jedes Mal, wenn ich darauf zugreifen will, die Unboxing-Kosten von einem generischen Python-Objekt zu einem "ndarray" bezahlen muss, was ich vermeiden möchte. – cfh