如何连续获取一定量值的均值?

How to get the mean of a certain amount of value continuously?

我从串行端口连续接收大量数据,我想每次收到例如 100 个值时取一个平均值,我的问题是最简单的方法是什么?

这是我的代码:

import serial

ser = serial.Serial('COM23', 19200)

while 1 :

    var = ser.readline()
    fl = float(var)
    print(fl)
    KeyboardInterrupt

ser.close()

离开你的原始代码,它可能看起来像这样:

import serial

ser = serial.Serial('COM23', 19200)
meanList = []
counter = 0
total = 0

while 1 :

    var = ser.readline()
    counter += 1
    fl = float(var)
    total += fl
    print(fl)

    if (counter >= 100):
        counter = 0
        meanList.append(total / 100.0)
        total = 0

    KeyboardInterrupt

ser.close()
return meanList

这将为您提供一个列表,其中包含程序中每 100 次之后的所有均值。您可以更改数字以调整您希望取均值的频率。

一个更优雅的解决方案是使用固定大小的队列,它只包含最后 N 个项目。在您的情况下,最后 100 项。

N = 100
values = collections.deque(maxlen=N)

当你需要计算移动平均线时,调用一个函数如:

def mean(items, size=N):
    return sum(items)/size

可以通过以下方式将这些想法插入您的代码中:

import serial

ser = serial.Serial('COM23', 19200)

while 1 :

    var = ser.readline()
    values.append(var)
    # This queue will keep the last 100 items. 
    # ...
    # ...
    # when you need to use the mean...
    print(mean(values))
    # ... the rest of your code    

请注意,在队列满之前,按原样使用该函数的平均值不会正确。如果需要第一个数据的平均值,需要稍微修改函数。