2013-02-03 13 views
4

현재 비트 검사 알고리즘을 파이썬과 numpy/scipy로 구현하고 있습니다. 기본적으로 .wav 파일을 읽고 처리해야합니다. 여기서 코드 :numpy 배열을 쌍으로 매핑

sampling_rate, wave_data = scipy.io.wavfile.read(argv[1]) 

wave_data 약 000 개의 요소 (441) (44.1 kHz 샘플링 레이트를 갖는 음성 10 초)과 1-D의 NumPy와 배열이다. 이제이 배열의 두 요소에 대해 기본적인 수학을 수행해야합니다. 이것은 지금 제가하는 방법입니다 :

wave_data = [sampling_rate * (wave_data[i+1] - wave_data[i]) 
      for i in xrange(len(wave_data)-1)] 

이 opreation은 (프로파일 링없이 눈에 띄는) 시간이 오래 걸립니다. 필자는 새로운 파이썬리스트를 만들지 않고 "in-place"배열을 쌍으로 매핑해야합니다. 나는 numpy.vectorize이 있다는 것을 알고 있지만 매핑 쌍을 어떻게 할 수 있는지 모르겠습니다. (배열의 두 요소를 모두 매핑하십시오). 다음의

답변

4

중 하나가 그것을 할 것입니다 : 예를 들어

wave_date = sampling_rate * np.diff(wave_data) 

또는

wave_date = sampling_rate * (wave_data[1:] - wave_data[:-1]) 

:

In [7]: sampling_rate = 2 

In [8]: wave_data = np.array([1, 3, 5, 2, 8, 10]) 

In [9]: sampling_rate * (wave_data[1:] - wave_data[:-1]) 
Out[9]: array([ 4, 4, -6, 12, 4]) 

는 지금까지 성능에 관한 한, 이러한 접근 방식 모두에 대한 있습니다 목록 이해보다 500 배 빠름 :

In [16]: wave_data = np.array([1., 3, 5, 2, 8, 10, 5, 2, 4, 7] * 44100) 

In [17]: %timeit sampling_rate * np.diff(wave_data) 
100 loops, best of 3: 2.2 ms per loop 

In [18]: %timeit sampling_rate * (wave_data[1:] - wave_data[:-1]) 
100 loops, best of 3: 2.15 ms per loop 

In [19]: %timeit [sampling_rate * (wave_data[i+1] - wave_data[i]) for i in xrange(len(wave_data)-1)] 
1 loops, best of 3: 970 ms per loop 
+1

'wave_date [1 :]'과'wave_date [: - 1]'은 기존 배열에 대한 뷰를 생성하고 너무 많은 메모리를 소비하지 않는다는 것을 언급해야한다고 생각합니다. 그들의 차이가 새로운 배열을 만들지 만. – Bakuriu

+0

작업으로 인해 나를 메모리 관리 괴물로 만들었으므로 아마도 'wave_data [1 :] - = wave_data [: - 1]; wave_data * = sampling_rate; wave_data = wave_data [: - 1]'이는 생성 할 배열이 없기 때문에 실제로는 조금 더 빨라질 수 있습니다. – Jaime

관련 문제