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?

questionAnswers(4)

yourAnswerToTheQuestion