Die übergabe und Rückgabe numpy-arrays in C++ - Methoden über Cython

Gibt es viele Fragen zur Verwendung von numpy in cython auf dieser Website, die besonders nützlich sein Einfach die Verpackung von C-code mit cython.

Jedoch die cython/numpy-Schnittstelle api scheint sich ein wenig geändert haben, insbesondere mit der Sicherstellung der Weitergabe der Erinnerung zusammenhängenden arrays.

Was ist der beste Weg, um zu schreiben eine wrapper-Funktion in cython, dass:

  • nimmt ein numpy-array, ist wahrscheinlich, aber nicht unbedingt zusammenhängende
  • ruft eine C++ - Klasse Methode mit der Signatur double* data_in, double* data_out
  • gibt ein numpy-array der double* dass die Methode, die schrieb?

Meinen versuchen ist unten:

cimport numpy as np
import numpy as np # as suggested by jorgeca

cdef extern from "myclass.h":
    cdef cppclass MyClass:
        MyClass() except +
        void run(double* X, int N, int D, double* Y)

def run(np.ndarray[np.double_t, ndim=2] X):
    cdef int N, D
    N = X.shape[0]
    D = X.shape[1]

    cdef np.ndarray[np.double_t, ndim=1, mode="c"] X_c
    X_c = np.ascontiguousarray(X, dtype=np.double)

    cdef np.ndarray[np.double_t, ndim=1, mode="c"] Y_c
    Y_c = np.ascontiguousarray(np.zeros((N*D,)), dtype=np.double)

    cdef MyClass myclass
    myclass = MyClass()
    myclass.run(<double*> X_c.data, N, D, <double*> Y_c.data)

    return Y_c.reshape(N, 2)

Dieser code kompiliert, aber nicht unbedingt optimal. Haben Sie irgendwelche Vorschläge auf die Verbesserung der snippet oben?

, und (2) Würfe und "np ist nicht definiert Zeile X_c = ...") beim Aufruf zur Laufzeit.
Die genaue testen von code und die Fehlermeldung sind folgende:

import numpy as np
import mywrapper
mywrapper.run(np.array([[1,2],[3,4]], dtype=np.double))

# NameError: name 'np' is not defined [at mywrapper.pyx":X_c = ...]
# fixed!

  • Haben Sie immer noch import numpy as np in Ihrem .pyx - Datei zu verwenden numpy-Funktionen (cimport numpy as np "wird verwendet, um zu importieren, spezielle compile-time-Informationen über die numpy-Modul").
  • Ich denke, dein Kommentar Antworten, die OP-Frage...
  • Ich habe es gepostet als Kommentar, weil ich dachte, es war eine kleine Hürde, aber ich weiß nicht, was ist der beste Weg, um zu schreiben, diese Schnittstellen.
  • Danke, es war tatsächlich die fehlenden Angaben, die Ursache der Fehlermeldungen. Und Sie haben Recht, ich bin hauptsächlich auf der Suche für Optimierungen 🙂
Schreibe einen Kommentar