首页 > 解决方案 > python numpy - 有没有更快的卷积方法?

问题描述

我有一个非常大的 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]

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

不管怎样,这个例子运行得很快。但是当卷积超过百万个元素数组并且窗口大小为 10,000 时,需要 2 秒才能完成。如果我选择 500,000 的 windows_size,则需要 3 分钟才能完成。

有没有更好的方法来对具有特定窗口大小的数组求和以加快速度?如果我把它转换成熊猫系列,我可以在那里使用一些东西吗?

谢谢你的帮助!

标签: pythonarraysnumpysum

解决方案


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

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


推荐阅读