我是Python新手,我有一些参数检测数组,有些值被错误地检测到(如4555555):
array = [1, 20, 55, 33, 4555555, 1]
我想以某种方式平滑它。现在我用加权平均值来做这件事:
def smoothify(array):
for i in range(1, len(array) - 2):
array[i] = 0.7 * array[i] + 0.15 * (array[i - 1] + array[i + 1])
return array
但它的工作非常糟糕,当然,我们可以采用超过3个元素的加权平均值,但它会导致复制...我试图找到一些本机函数,但我失败了。
你可以帮帮我吗?P.S。对不起,如果这是一个菜鸟问题:(
谢谢你的时间, 最好的问候,安娜
答案 0 :(得分:2)
对于加权平滑目的,您基本上希望执行convolution
。对于我们的情况,由于我们正在处理一维数组,我们可以简单地使用NumPy的一维卷积函数:np.convolve
作为矢量化解。这里要记住的唯一重要的事情是,考虑到使用在主输入数组上滑动的内核的反转版本的卷积的性质,权重将被反转。因此,解决方案是 -
weights = [0.7,0.15,0.15]
out = np.convolve(array,np.array(weights)[::-1],'same')
如果您希望获得加权平均值,则可以获得out/sum(weights)
的加权平均值。在我们的例子中,由于给定权重的总和已经是1
,因此输出将与out
保持一致。
让我们将输出与输入一起绘制图形调试 -
# Input array and weights
array = [1, 20, 55, 33, 455, 200, 100, 20 ]
weights = [0.7,0.15,0.15]
out = np.convolve(array,np.array(weights)[::-1],'same')
x = np.arange(len(array))
f, axarr = plt.subplots(2, sharex=True, sharey=True)
axarr[0].plot(x,array)
axarr[0].set_title('Original and smoothened arrays')
axarr[1].plot(x,out)
输出 -
答案 1 :(得分:1)
建议numpy.average为您提供帮助。诀窍是计算权重 - 下面我压缩三个列表 - 一个与原始数组相同,下一步,后一步。获得权重后,我们将其输入np.average
函数
import numpy as np
array = [1, 20, 55, 33, 4555555, 1]
arrayCompare = zip(array, array[1:] + [0], [0] + array)
weights = [.7 * x + .15 * (y + z) for x, y, z in arrayCompare]
avg = np.average(array, weights=weights)
答案 2 :(得分:0)
也许你想看看numpy,尤其是numpy.average。 另外,你有没有看到这个问题Weighted moving average in python?也可以提供帮助。
答案 3 :(得分:0)
因为你用numpy标记了这个,我写了如何使用numpy:
import numpy as np
def smoothify(thisarray):
"""
returns moving average of input using:
out(n) = .7*in(n) + 0.15*( in(n-1) + in(n+1) )
"""
# make sure we got a numpy array, else make it one
if type(thisarray) == type([]): thisarray = np.array(thisarray)
# do the moving average by adding three slices of the original array
# returns a numpy array,
# could be modified to return whatever type we put in...
return 0.7 * thisarray[1:-1] + 0.15 * ( thisarray[2:] + thisarray[:-2] )
myarray = [1, 20, 55, 33, 4555555, 1]
smootharray = smoothify(myarray)
不是循环遍历原始数组,而是使用numpy,您可以通过索引获得“切片”。输出数组将比输入数组短两个项目。中心点(n)是thisarray [1:-1]:“从项目索引1到最后一项(不包括)”。其他切片是“从索引2到结尾”和“除了最后两个之外的所有内容”