Ich habe Cython-Code, der eine 2d numpy.ndarray
von Daten (M
) und eine numpy.ndarray
von Indizes (Ixs
) dauert. Es durchläuft die Einträge von Ixs
und verwendet die Werte ix
von Ixs
, um Spalten von M
zu indizieren. Sehen Sie den Code unten:Sollte eine Cython-Speicheransicht von Indizes vom Typ Py_ssize_t oder int sein?
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])
Ich weiß, dass ich eigentlich bin Py_ssize_t
als Typ für Indizes verwenden (Ich habe es für 64-Bit-Architekturen aufzunehmen ist), aber jetzt ich eine Speicher Ansicht Typ bin mit int
... In diesem Fall sehe ich keine Möglichkeit, eine numpy.ndarray
Py_ssize_t
zu erstellen, so dass ix
Py_ssize_t
ist.
Was ist der richtige Weg, um diesen Cython-Code zu schreiben? Gibt es ein Problem bei der Verwendung von int
?
also lasst uns sagen, dass ich es in Python zu gieße np.intp ('Ixs = Ixs.atype (np.intp)') dann umschreiben ich diese Funktion als: 'def foo (double [:, :: 1] M, Py_ssize_t [:, :: 1] Ixs): 'oder? – Gioelelm
Ja, obwohl "Ixs" im Idealfall bei der Erstellung intp eingegeben hat, um die Besetzung zu vermeiden. – chrisb
Natürlich, aber in meinem Fall wird es eine Ausgabe einer scikit Lernfunktion sein. – Gioelelm