gpt4 book ai didi

python - 基于时间的最快移动平均值

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:51 25 4
gpt4 key购买 nike

我目前有一个使用有效列表的移动平均线,但想看看是否有更快的方法来完成此任务。

 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)

最佳答案

对于这样的问题,您需要一个可以在两侧有效扩展或截断的数据结构。 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)

关于python - 基于时间的最快移动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com