Wrapping std :: array in Cython und Exponieren für Speicheransichten
Es scheint, dass es derzeit eine Pull-Anfrage in Cythons Repo gibt, um c ++ @ zu verpackestd::array
aber bis dahin könnte ich Hilfe gebrauchen. Ich wickle gerade das @ estd::array
wie so:
cdef extern from "<array>" namespace "std" nogil:
cdef cppclass array2 "std::array<double, 2>":
array2() except+
double& operator[](size_t)
Dies funktioniert, aber ich muss eine Schleife über eine Cython-Speicheransicht ausführen, z. B. double arr [:], und die Werte einzeln kopieren. Gibt es einen einfacheren Weg, dies zu tun? Im Wesentlichen möchte ich Folgendes tun:
cdef double arr[2]
arr[0] = 1.0
arr[1] = 2.0
cdef array2 array2_arr = arr
#and the reverse
cdef array2 reverse
reverse[0] = 1.0
reverse[1] = 2.0
cdef double reverse_arr[2] = reverse
Ist das völlig unvernünftig? Als Ergebnis arbeiten mitstd::array
ist extrem mühsam, weil ich eine for-Schleife haben muss, um Werte von Cython nach C ++ und von C ++ nach Cython zu kopieren. Da Cython nicht die Möglichkeit bietet, Template-Parameter ohne Typ zu verwenden, muss für jede Variation von @ ein Wrapper definiert werdestd::array
in meinem Code. Anregungen zur effizienten Arbeit mitstd::array
wäre sehr dankbar.
bearbeiten
Ich bin jetzt in der Lage, von einer Speicheransicht zu einem Array2-Typ zu wechseln, indem ich Folgendes verwende:
def __cinit__(self, double[:] mem):
cdef array2 *arr = <array2 *>(&mem[0])
Aber es scheint, dass ich Cython nicht dazu bringen kann, einen Array2-Typ in eine Speicheransicht zu konvertieren, egal was ich tue:
cdef array2 arr = self.thisptr.getArray()
# error: '__pyx_t_1' declared as a pointer to a reference of type 'double &'
cdef double[::1] mview = <double[:2]>(&arr[0])
#OR
# Stop must be provided to indicate shape
cdef double[::1] mview = <double[::2]>(&arr[0])
Bitte hilf mir herauszufinden, wie ein C ++ - Zeiger auf eine Speicheransicht umgewandelt wird. Jede Kombination, die ich bisher ausprobiert habe, hat zu einem Casting-Fehler geführt.
EDIT: Ich habe festgestellt, dass ich mit einer neueren Version von Cython (ich habe Cythong 0.22 verwendet) und einem Upgrade auf 0.23.5 die folgende Syntax fehlerfrei ausführen soll.
cdef double[::1] mview = <double[:4]>(&arr[0])
Wenn ich jedoch versuche, mview von der Funktion, in der ich es verwende, zurückzugeben, erhalte ich Speicherplatz. Das Zurücksetzen der Speicheransicht auf den Zeiger meines Arrays verliert den Gültigkeitsbereich und zerstört daher automatisch mein Array. Sobald ich herausgefunden habe, wie ich mein Array ordnungsgemäß zurückgeben kann, versuche ich, die offizielle Antwort zu aktualisieren.