我目前正在使用 python 和 numpy/scipy 实现节拍检测算法。我基本上需要读取一个 .wav 文件并对其进行处理。这是代码:
sampling_rate, wave_data = scipy.io.wavfile.read(argv[1])
wave_data
是一个一维 numpy 数组,包含大约 441 000 个元素(10 秒的声音,采样率为 44.1 kHz)。现在,我需要对这个数组中的每两个元素做一些基本的数学运算。这就是我现在的做法:
wave_data = [sampling_rate * (wave_data[i+1] - wave_data[i])
for i in xrange(len(wave_data)-1)]
这种操作需要太多时间(没有分析就很明显)。我需要成对地“就地”映射数组,而不创建新的 python 列表。我知道有numpy.vectorize
,但我不知道如何成对进行映射(映射数组的每两个元素)。