2017-09-15 2 views
2

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.ndarrayPy_ssize_t zu erstellen, so dass ixPy_ssize_t ist.

Was ist der richtige Weg, um diesen Cython-Code zu schreiben? Gibt es ein Problem bei der Verwendung von int?

Antwort

3

Eine Sache zu beachten, werden Sie ix

Ihr Code eingeben, wie es funktioniert OK geschrieben, M[c, ix] wird gegossen ix von einem int zu Py_ssize_t, die immer eine sichere Umwandlung sein sollte.

Das heißt, Sie können und sollten wahrscheinlich Ihre Indexer-Array von Py_ssize_t haben. Der entsprechende numpy Typ ist np.intp

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

+0

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

+0

Ja, obwohl "Ixs" im Idealfall bei der Erstellung intp eingegeben hat, um die Besetzung zu vermeiden. – chrisb

+0

Natürlich, aber in meinem Fall wird es eine Ausgabe einer scikit Lernfunktion sein. – Gioelelm

Verwandte Themen