Como passar uma matriz Numpy em uma função cffi e como obter uma volta?
Estou desenvolvendo um algoritmo de áudio usando Python e Numpy. Agora eu quero acelerar esse algoritmo implementando uma parte dele em C. No passado,Eu fiz isso usando cython. Agora eu quero fazer a mesma coisa usando o novocffi.
Para fins de teste, escrevi uma função C trivial:
void copy(float *in, float *out, int len) {
for (int i=0; i<len; i++) {
out[i] = in[i];
}
}
Agora quero criar dois matrizes numpy e tê-los processados por essa função. Eu descobri uma maneira de fazer isso:
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)
No entanto, gostaria de melhorar este código:
Existe uma maneira de acessar diretamente os buffers flutuantes subjacentes dos matrizes numpy sem copiá-los?ffi.buffer
é muito conveniente para converter rapidamente o conteúdo de um array C em um array Numpy. Existe uma maneira equivalente de converter rapidamente um array numpy em um array C sem copiar os elementos individuais?Para algumas aplicações,float_in[0:16] = arr_in[0:16]
é uma maneira conveniente de acessar dados. O oposto,arr_out[0:16] = float_out[0:16]
não funciona no entanto. Por que não?