我正在对列表中的一些连续整数数据进行平滑处理。我的平滑方法是用该数字及其邻居的均值替换每个数字。我目前正在使用以下代码进行操作:
from statistics import mean
smoothednums = [mean(nums[:2])] + [mean(nums[i-1:i+2]) for i in range(1,len(nums))]
这大大增加了我的脚本的运行时间。有没有更好的方法来执行此操作?
答案 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):
答案 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:]))