我的代码试图计算列表的移动平均值,但计算错误。这是代码:
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轴位于窗口中心的移动平均数据点。