2010-07-07 21 views
9

Nadal piszę na interfejsie Pythona dla mojego kodu c z ctypes. Dzisiaj zastąpiłem funkcję czytania pliku wersją pythona, która została zaprogramowana przez kogoś innego usind NumPy. "Stara" wersja c została wywołana z byref (p_data) podczas p_data = PFloat() (patrz poniżej). Główna funkcja przyjmuje p_data.Jak korzystać z tablicy NumPy z ctypami?

Old odczytu pliku:

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

Pyton funkcja odczytu plików z drugiej strony zwraca tablicę NumPy. Moje pytanie brzmi teraz:

Jak przekonwertować tablicę NumPy na POINTER (c_float)?

google ale tylko znaleźć na odwrót: C arrays through ctypes accessed as NumPy arrays i rzeczy nie rozumiałem: C-Types Foreign Function Interface (numpy.ctypeslib)

[aktualizacja] skorygować błąd w kodzie np

Odpowiedz

15

Twój kod to wygląda ma pewne niejasności - ctypes.POINTER() tworzy nowy wskaźnik ctypes klasa, a nie instancja ctypes. W każdym razie najprostszym sposobem na przekazanie tablicy NumPy do kodu ctypes jest użycie metody numpy.ndarray 's ctypes z atrybutem data_as. Po prostu upewnij się, że podstawowe dane są we właściwym typie. Na przykład:

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

Dzięki! To było naprawdę pomocne! –

Powiązane problemy