大阵列的优化平均值?

Eiy*_*uyf 1 python average

所以我有一个.wav文件.从这里我得到了数据:正如预期的声音文件它是立体声所以数据看起来像

清单1(原始清单)

[[1,2],[2,3],[4,9],[1,5],[1,7],....]

注意:我刚刚编写了这些数字,但重点是它是一个嵌套列表.这里的问题是我正在做FFT,因此我想只使用两个通道的平均值,所以我想:

清单2(平均)

[[1.5],[2.5],[6.5],[3],[4],....]

所以我这样做了:

averaged_array =  [sum(x)/len(x) for x in original_list]
Run Code Online (Sandbox Code Playgroud)

我假设len(x)是一个恒定时间操作,即使它总是2.

这里的问题是我相信原始列表的长度> 900,000.在我的家用电脑上,我可以在~46秒内平均一次.在我需要用于演示的计算机上需要约121秒.这是一个相当大的增长,坦率地说,它必须在它运行时等待.无论如何,我可以优化它,以便减少它所需的时间吗?

注意:我相信这是一台双核计算机,所以我不能并行运行(我想?).我可以ssh到服务器(运行一些i7),我已被允许使用..如果我以某种方式ssh'ed并在那里进行计算会更好吗?我正在使用的原始计算机是~2 ghz,但是是一个古老的戴尔模型亲戚(几年前的系列).此外,迈克菲和另一个进程也消耗了约50%的处理,我没有权利杀死这些.

如果我这样做:

  • 如何通过SSH在这台远程计算机上进行计算?(我正在使用python 2.7并且真的不想安装任何外部库,因为这不是我的计算机而是组织计算机)
  • 我能以某种"顺序"进行计算吗?我认为,当并行执行操作时,您无法保持顺序,因为只要核心处于打开状态就可以进行计算.顺序我的意思是:我希望列表保持原始列表的相同索引的平均值.防爆.[[1,2],[3,4]]应该[[2.5],[3.5]]不[[3.5],[2.5]]

Eri*_*got 6

对于这类任务,您确实希望使用事实上的标准NumPy模块.该模块以高效的方式处理大型数组(如果您需要,它甚至可以为您进行FFT).

您可以通过以下方式获得平均值:

>>> a = numpy.array([[1,2], [2,3], [4,9], [1,5], [1,7]])
>>> numpy.average(a, axis=-1)
array([ 1.5,  2.5,  6.5,  3. ,  4. ])
Run Code Online (Sandbox Code Playgroud)

在我的机器上执行100万对数组上的平均值仅需22 ms.

然后可以使用numpy.fft模块完成FFT .

  • @EOL建议你使用NumPy.如果这样做,那么就不应该使用Python本机模块来导入wave文件; 相反,使用SciPy函数`scipy.io.wavfile.read()`.http://docs.scipy.org/doc/scipy/reference/tutorial/io.html它会快得多. (3认同)