python numpy-有没有更快的卷积方法?

Leg*_*ack 3 python arrays numpy sum

我有一个非常大的numpy数组(一百万个整数)。我正在使用np.convolve来查找该数组的“最密集”区域。“最小”区域是指固定长度的窗口,该窗口在求和时具有最高的数字。让我向您展示代码:

import numpy as np

example = np.array([0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0,1,0])
window_size = 10
density = np.convolve(example, np.ones([window_size]), mode='valid')
print(density) 
# [7.0, 7.0, 8.0, 9.0, 9.0, 9.0, 8.0, 7.0, 6.0, 6.0, 5.0, 5.0, 5.0, 5.0, 4.0, 4.0, 4.0, 4.0, 4.0, 3.0, 3.0, 4.0, 3.0]
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用np.argmax(density)来获取最高密度区域的起始索引3

无论如何,通过此示例,它可以快速运行。但是当卷积超过一百万个元素数组且窗口大小为10,000时,需要2秒才能完成。如果我选择Windows_size为500,000,则需要3分钟才能完成。

有没有更好的方法可以对具有一定窗口大小的数组求和以加快速度呢?如果我将其转换为熊猫系列,我是否可以在其中使用某些东西?

谢谢你的帮助!

War*_*ser 7

尝试使用scipy.signal.convolve。它具有使用快速傅里叶变换(FFT)计算卷积的选项,对于您提到的数组大小,卷积应该更快。

使用example长度为1000000 的数组并将其与长度为卷积进行卷积10000np.convolve在我的计算机上花费了大约1.45秒,并且scipy.signal.convolve花费了22.7毫秒。