我目前有一个移动平均线,它使用一个有效的列表,但我想看看去皮是实现此目的的更快方法。
strut[i].cpsi = round(bit2UntrimPSI(i) + float(strut[i].trim), 0)
strut[i].rpsi.append([time.time(), strut[i].cpsi])
while strut[i].rpsi[0][0] <= time.time() - apsiTimeWindow:
del strut[i].rpsi[0]
strut[i].apsi = mean([n[1] for n in strut[i].rpsi])
我试图使用Numpy的cumsum函数来完成此操作,但是我唯一的问题是数组的大小是恒定的,并且据我所知无法用时间来控制。下面是那个例子。
def running_mean(x, N):
cumsum = numpy.cumsum(numpy.insert(x, 0, 0))
return (cumsum[N:] - cumsum[:-N]) / float(N)
答案 0 :(得分:0)
对于这样的问题,您需要一个可以在两侧有效地扩展或截断的数据结构。 Python list
在结尾处很有效率,但在开始时却没有效率。 deque是更好的选择。我不理解您的大问题是否足以按照精确的代码来构建演示,但这是一个演示,它演示了在需要获取更多值的情况下使用deque
的想法。 ,丢弃太旧的值,然后计算剩余值的平均值。
from collections import deque
from random import randint
# A double-ended queue and the current "time".
pairs = deque()
t = 0
# Check a few rounds.
for _ in range(3):
# Get some more simulated (TIME, VALUE) pairs.
n_vals = randint(5, 10)
for _ in range(n_vals):
val = randint(1, 10)
pairs.append((t, val))
time_incr = randint(1, 20)
t += time_incr
# Check.
print('\nBEFORE :', pairs)
# Exclude the data older than 30.
last_time = pairs[-1][0]
oldest_time = last_time - 30
while pairs[0][0] < oldest_time:
pairs.popleft()
# Get mean of remaining vals.
vals = [v for _, v in pairs]
m = sum(vals) / len(vals)
# Check.
print('AFTER :', pairs)
print('VALS :', vals)
print('MEAN :', m)