나는 Python과 Numpy를 사용하여 오디오 알고리즘을 개발 중이다. 이제 알고리즘을 C로 구현하여 알고리즘 속도를 높이고 싶습니다. 과거에는 I have done this using cython이었습니다. 이제 새로운 cffi을 사용하여 동일한 작업을 수행하려고합니다. Numpy 배열을 cffi 함수로 전달하는 방법과이를 다시 얻는 방법은 무엇입니까?
void copy(float *in, float *out, int len) {
for (int i=0; i<len; i++) {
out[i] = in[i];
}
}
가 지금은 두 NumPy와 배열을 생성하고 그가이 기능에 의해 처리 될 갖고 싶어 :
는 테스트를 위해, 나는 사소한 C의 기능을 썼다.
- 직접 복사하지 않고 NumPy와 배열의 기본 부동 소수점 버퍼에 액세스 할 수있는 방법이 있나요 : 나는이 코드를 개선하고자하는, 그러나
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)
: 나는 그렇게 할 수있는 방법을 알아 냈어 그들?
ffi.buffer
은 C 배열의 내용으로 Numpy 배열로 신속하게 변환하는 데 매우 편리합니다. 개별 요소를 복사하지 않고도 numpy 배열을 C 배열로 신속하게 변환 할 수있는 동일한 방법이 있습니까?- 일부 응용 프로그램의 경우 편리한 데이터 액세스 방법은
float_in[0:16] = arr_in[0:16]
입니다. 반대로,arr_out[0:16] = float_out[0:16]
하지만 작동하지 않습니다. 왜 안돼? ndarray의
한 진보를 언급에 대해 – Matthias