2010-07-07 16 views
9

Ich schreibe immer noch auf eine Python-Schnittstelle für meinen c-Code mit Ctypes. Heute habe ich meine Dateilesefunktion durch eine Python-Version ersetzt, die von jemand anderem programmiert wurde, der NumPy benutzt. Die 'alte' c-Version wurde mit einem byref (p_data) aufgerufen, während p_data = PFloat() (siehe unten). Die Hauptfunktion übernimmt die p_data.Wie verwendet man NumPy Array mit Ctypes?

Alte Datei lesen:

p_data=POINTER(c_float) 
foo.read(filename,byref(p_data)) 
result=foo.pymain(p_data) 

Die Python-Datei Lesefunktion auf der anderen Seite gibt eine NumPy Array. Meine Frage ist jetzt:

Wie konvertiere ich ein NumPy-Array zu POINTER (c_float)?

Ich googeln fand aber nur umgekehrt: C arrays through ctypes accessed as NumPy arrays und Dinge, die ich nicht verstehen: C-Types Foreign Function Interface (numpy.ctypeslib)

[update] einen Fehler im Beispielcode korrigiert

Antwort

15

Ihr Code wie es aussieht, hat etwas Verwirrung drin - ctypes.POINTER() erstellt einen neuen Ctypes-Zeiger Klasse, keine Ctypes-Instanz. Wie auch immer, der einfachste Weg, ein NumPy-Array an Ctypes-Code zu übergeben, ist die Verwendung der ctypes Attribut data_as Methode. Stellen Sie nur sicher, dass die zugrunde liegenden Daten zuerst der richtige Typ sind. Zum Beispiel:

c_float_p = ctypes.POINTER(ctypes.c_float) 
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]]) 
data = data.astype(numpy.float32) 
data_p = data.ctypes.data_as(c_float_p) 
+0

Vielen Dank! Das war sehr hilfreich! –