前提・実現したいこと
Pythonで以下のような処理を行いたいのですが、for文中の処理が非常に遅く高速化したいです。
forを用いない表記や配列の参照を少なくする方法などありますでしょうか。
Python3
1import numpy as np 2import scipy.io.wavfile 3from numpy.random import * 4 5sampling_rate = 44110 6wave_form = randint(0,2,3600000) 7th_min = - int(0.09*sampling_rate) 8th_max = int(0.09*sampling_rate) 9diff_th = th_max - th_min 10wave_form_len = len(wave_form) 11recording_arr = np.zeros(wave_form_len) 12 13for th in range(wave_form_len): 14 15 if(th_min<0): 16 if (np.sum(wave_form[:th_max]) / th_max) * 100 <= 80: 17 recording_arr[th] = 1 18 19 if(th_min>=0)and(th_max<wave_form_len): 20 if (np.sum(wave_form[th_min:th_max])/diff_th)*100 <=80: 21 recording_arr[th] = 1 22 23 if(th_max>=wave_form_len): 24 if (np.sum(wave_form[th_min:])/(wave_form_len -th_min)*100 <=80: 25 recording_arr[th] = 1 26 27 th_min += 1 28 th_max += 1
追記
頂いたご指摘を全て合わせて以下のように実装したところ、正常に動作した上で30秒ほどかかっていた動作が15秒にまで改善されました。
本来扱いたいwave_formの長さは1億ほどなので、もう少し高速化したいとは思いますが、なにか方法はありますでしょうか。
Python3
1import numpy as np 2from numpy.random import * 3 4sampling_rate = 44110 5wave_form = randint(0,2,3600000) 6th_min = - int(0.09*sampling_rate) 7th_max = int(0.09*sampling_rate) 8diff_th = th_max - th_min 9wave_form_len = len(wave_form) 10recording_arr = np.zeros(wave_form_len) 11waveform_sum = np.sum(waveform[:th_max-1]) 12 13for th in range(wave_form_len): 14 15 if(th_min<0): 16 waveform_sum += wave_form[th_max] 17 if (waveform_sum / th_max) * 100 <= 80: 18 recording_arr[th] = 1 19 20 if(th_min>=0)and(th_max<wave_form_len ): 21 waveform_sum += wave_form[th_max] 22 waveform_sum -= wave_form[th_min] 23 if (waveform_sum /diff_th)*100 <=80: 24 recording_arr[th] = 1 25 26 if(th_max>=wave_form_len ): 27 waveform_sum -= wave_form[th_min] 28 if (waveform_sum /(wave_form_len -th_min))*100 <=80: 29 recording_arr[th] = 1 30 31 th_max += 1 32 th_min += 1
2点ほど確認があります。
th_max > len(wave_form) 時の計算ですが、 (np.sum(wave_form[th_min:])/wave_form_len -th_min ではなくて (np.sum(wave_form[th_min:])/(wave_form_len -th_min) の間違いではないですか?
ご指摘ありがとうございます。その通りです。修正させていただきます
もう一点は、th_min > 0 かつ tmax > len(wave_form) 時は2つ目と3つ目の条件文がTrueとなり動作しておりますが、3つ目のみが動作するのが正しい動作ではありませんか?
これは失念していました…ありがとうございます!こちらも修正させていただきます。

回答1件
あなたの回答
tips
プレビュー