我在numpy數組中加載了一些音頻數據,我希望通過查找無聲部分來分段數據,即音頻幅度低於aa某個閾值的部分時間段。在numpy數組中查找滿足條件的大量連續值
極其簡單的方法來做到這一點是這樣的:
values = ''.join(("1" if (abs(x) < SILENCE_THRESHOLD) else "0" for x in samples))
pattern = re.compile('1{%d,}'%int(MIN_SILENCE))
for match in pattern.finditer(values):
# code goes here
上述代碼發現其中存在比SILENCE_THRESHOLD至少MIN_SILENCE連續元素更小的部分。
現在,很明顯,上面的代碼是非常低效率和可怕的濫用正則表達式。還有其他一些更高效的方法,但是仍然會導致同樣簡單和短的代碼?
這導致令人印象深刻的20倍加速!它沒有考慮到最小長度,但這很容易添加。唯一的問題是增加的內存使用情況,使得在某些情況下使用它是不可行的,所以我想我會默認使用這個選項,並且在內存不足時添加一個選項來使用另一種算法。 – pafcu 2010-12-21 05:46:56
隨着numpy 1.9,我得到一個'DeprecationWarning:numpy布爾subtract(二進制運算符)已棄用'使用np.diff在布爾條件。我用'd = np.subtract(condition [1:],condition [: - 1],dtype = np.float)'替換了這一行,以避免這個問題。 – daryl 2014-09-29 15:30:43
@daryl - 感謝您注意到變化!可以更清楚地做'd = np.diff(condition.astype(int))',儘管這主要是個人偏好的問題。 – 2014-09-29 19:10:38