使用for循环移动平均Python



我的代码试图计算列表的移动平均值,但计算错误。这是代码:

import numpy as np
import matplotlib.pyplot as plt

for i in a:
this_window = a[i : i + window_size]
window_average = sum(this_window) / window_size
Mov_Avg.append(window_average)
display(Mov_Avg)
plt.plot(Mov_Avg)

您应该在range(len(a((的元素上循环,而不是直接在a的元素上。

import numpy as np
import matplotlib.pyplot as plt
a = np.array([5,3,8,10,2,1,5,1,0,2])
window_size = 2
plt.plot(a)
Mov_Avg = [] #Empty list that will hold the resulting moving averages
for i in range(len(a)):
this_window = a[i : i + window_size]
window_average = sum(this_window) / window_size
Mov_Avg.append(window_average)
plt.plot(Mov_Avg)

我在这里看到两个问题:

  • 由于您正在进行移动平均,一旦您到达距离数组a的末尾小于window_size的索引,您就会越界
  • for i in a不提供访问数组a的索引,而是提供数组内的实际值

你想做的是这样的事情:

import numpy as np
a = np.array([5,3,8,10,2,1,5,1,0,2])
window_size = 2
Mov_Avg = []
for i in range(a.size - window_size + 1):
this_window = a[i : i + window_size]
window_average = sum(this_window) / window_size
Mov_Avg.append(window_average)

哪个给出:

>>> print(a)
[ 5  3  8 10  2  1  5  1  0  2]
>>> print(Mov_Avg)
[4.0, 5.5, 9.0, 6.0, 1.5, 3.0, 3.0, 0.5, 1.0]

注意,由于这里是window_size == 2,所以您得到了len(Mov_Avg) == a.size - 1。一般情况在上面的range中。在绘图时,你可以做的是:

x_a = np.arange(a.size)
x_Mov_Avg = (x_a + (window_size-1)/2)[:-(window_size-1)]
plt.plot(x_a, a)
plt.plot(x_Mov_Avg, Mov_Avg)
plt.show()

这将显示沿x轴位于窗口中心的移动平均数据点。

最新更新