Jak przekazać tablicę Numpy do funkcji cffi i jak ją odzyskać?
Opracowuję algorytm audio przy użyciu Pythona i Numpy. Teraz chcę przyspieszyć ten algorytm, implementując jego część w C. W przeszłościZrobiłem to za pomocą cython. Teraz chcę zrobić to samo, używając nowegocffi.
Dla celów testowych napisałem trywialną funkcję C:
void copy(float *in, float *out, int len) {
for (int i=0; i<len; i++) {
out[i] = in[i];
}
}
Teraz chcę utworzyć dwie tablice numpy i przetworzyć je za pomocą tej funkcji. Wymyśliłem sposób, aby to zrobić:
import numpy as np
from cffi import FFI
ffi = FFI()
ffi.cdef("void copy(float *in, float *out, int len);")
C = ffi.dlopen("/path/to/copy.dll")
float_in = ffi.new("float[16]")
float_out = ffi.new("float[16]")
arr_in = 42*np.ones(16, dtype=np.float32)
float_in[0:16] = arr_in[0:16]
C.copy(float_in, float_out, 16)
arr_out = np.frombuffer(ffi.buffer(float_out, 16*4), dtype=np.float32)
Chciałbym jednak poprawić ten kod:
Czy istnieje sposób bezpośredniego dostępu do bazowych buforów pływakowych tablic numpy bez ich kopiowania?ffi.buffer
jest bardzo wygodny do szybkiej konwersji do zawartości tablicy C na tablicę Numpy. Czy istnieje równoważny sposób na szybką konwersję tablicy numpy do tablicy C bez kopiowania poszczególnych elementów?W przypadku niektórych aplikacjifloat_in[0:16] = arr_in[0:16]
to wygodny sposób uzyskiwania dostępu do danych. Przeciwieństwo,arr_out[0:16] = float_out[0:16]
nie działa jednak. Dlaczego nie?