¿Cómo pasar una matriz Numpy a una función cffi y cómo recuperar una?

Estoy desarrollando un algoritmo de audio usando Python y Numpy. Ahora quiero acelerar ese algoritmo implementando una parte de él en C. En el pasado,Lo he hecho usando cython.. Ahora quiero hacer lo mismo usando el nuevoCffi.

Para propósitos de prueba, escribí una función trivial en C:

void copy(float *in, float *out, int len) {
    for (int i=0; i<len; i++) {
        out[i] = in[i];
    }
}

Ahora quiero crear dos matrices numpy y que sean procesadas por esta función. Descubrí una manera de hacer eso:

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)

Sin embargo, me gustaría mejorar este código:

¿Hay una manera de acceder directamente a los buffers subyacentes de las matrices numpy sin copiarlos?ffi.buffer es muy conveniente para convertir rápidamente los contenidos de una matriz C a una matriz Numpy. ¿Existe una forma equivalente de convertir rápidamente una matriz numpy en una matriz C sin copiar los elementos individuales?Para algunas aplicaciones,float_in[0:16] = arr_in[0:16] Es una forma conveniente de acceder a los datos. Lo contrario,arr_out[0:16] = float_out[0:16] Sin embargo, no funciona. Por qué no?

Respuestas a la pregunta(4)

Su respuesta a la pregunta