我在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