python 中数组的加权平均值
weighted average from an array in python
我需要通过替换每个数据值来形成一个新的数字序列,从第 4 个条目开始到最后一个条目的第 4 个结束,用它周围七个点的加权平均值,使用以下公式:
(y[i-3] + 2y[i-2] + 3y[i-1] + 3y[i] + 3y[i+1] + 2y[i+2] + y[i+3]) // 15
(注意。如果不明显,i- 或 i+ 某个数字是下标。)
这是我生成原始图形的代码,但我需要使用上述公式平滑新图形。数据文件生成一个整数数组,设置为 [-24, 4, -4, -12, -52...]
。我什至不确定从哪里开始使用公式,我们将不胜感激。
from matplotlib import pyplot as plt
with open('2_Record2308.dat', 'r') as f:
data = [int(x) for x in f]
graph = data
fig, ax = plt.subplots()
ax.plot(graph)
ax.legend()
ax.set_ylabel('Raw')
plt.tight_layout()
plt.show()
这段代码应该可以解决问题:
avg = [(sum(y) + sum(y[1:-1]) + sum(y[2:-2])) // 15
for y in zip(data[:-6], data[1:-5], data[2:-4], data[3:-3], data[4:-2], data[5:-1], data[6:])]
此处 zip(data[:-6], data[1:-5], ...)
创建连续的 7 元组。
而sum(y)
这7个号码各取一次。 sum(y[1:-1])
再次取里面的5个数。 sum(y[2:-2])
第三次取里面的3个数
顺便说一下,在除以 15 之前加 7 会更接近平均。在原始公式中,平均值总是向下舍入。
所以,我建议(sum(y) + sum(y[1:-1]) + sum(y[2:-2]) + 7) // 15
这是一个基于您的代码和随机游走数据的测试。
from matplotlib import pyplot as plt
import random
def do_averaging_7(data):
return [(sum(y) + sum(y[1:-1]) + sum(y[2:-2]) + 7) // 15
for y in zip(data[:-6], data[1:-5], data[2:-4], data[3:-3], data[4:-2], data[5:-1], data[6:])]
data = [random.randrange(-100,101) for _ in range(100)]
for i in range(1,len(data)):
data[i] += data[i-1]
avg = do_averaging_7(data)
fig, ax = plt.subplots()
ax.plot(range(len(data)), data, "blue")
ax.plot(range(3, 3+len(avg)), avg, color="red")
ax.set_ylabel('Raw')
plt.tight_layout()
plt.show()
结果图: