有没有办法加快python中的平滑操作?

时间:2019-06-12 20:49:38

标签: python optimization

我正在对列表中的一些连续整数数据进行平滑处理。我的平滑方法是用该数字及其邻居的均值替换每个数字。我目前正在使用以下代码进行操作:

from statistics import mean
smoothednums = [mean(nums[:2])] + [mean(nums[i-1:i+2]) for i in range(1,len(nums))]

这大大增加了我的脚本的运行时间。有没有更好的方法来执行此操作?

2 个答案:

答案 0 :(得分:2)

https://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html

您正在使用统一(框形)过滤器描述卷积:

smoothednums = np.convolve(nums, [1/3, 1/3, 1/3]);

对于较大的窗口,您可以考虑查看面积总和表算法,该算法的窗口大小为O(1):

Efficient summed Area Table Calculation with Numpy

答案 1 :(得分:0)

通过加减每个值的1/3可以避免所有切片和复制。 (浮点错误使该错误与您的原始错误不完全相同,但在正常情况下应该足够接近。)我不知道它的结束速度是否更快,但似乎值得一试:

window_mean = mean(nums[:3])
smoothednums = [mean(nums[:2]), window_mean]

for i in range(2, len(nums) - 1):
    window_mean -= nums[i - 2] / 3
    window_mean += nums[i + 1] / 3
    smoothednums.append(window_mean)

smoothednums.append(mean(nums[-2:]))
相关问题