我需要一个可在序列/迭代器/生成器上迭代的滚动窗口(也称为滑动窗口).默认的Python迭代可以被认为是一种特殊情况,窗口长度为1.我目前正在使用以下代码.有没有人有更多的Pythonic,更简洁,或更有效的方法来做到这一点?
def rolling_window(seq, window_size):
it = iter(seq)
win = [it.next() for cnt in xrange(window_size)] # First window
yield win
for e in it: # Subsequent windows
win[:-1] = win[1:]
win[-1] = e
yield win
if __name__=="__main__":
for w in rolling_window(xrange(6), 3):
print w
"""Example output:
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
"""
Run Code Online (Sandbox Code Playgroud) 有没有办法在Numpy中有效地实现1D阵列的滚动窗口?
例如,我有这个纯Python代码片段来计算1D列表的滚动标准偏差,其中observations是1D值列表,并且n是标准差的窗口长度:
stdev = []
for i, data in enumerate(observations[n-1:]):
strip = observations[i:i+n]
mean = sum(strip) / n
stdev.append(sqrt(250*sum([(s-mean)**2 for s in strip])/(n-1)))
Run Code Online (Sandbox Code Playgroud)
有没有办法在Numpy中完全执行此操作,即没有任何Python循环?标准偏差是微不足道的numpy.std,但滚动窗口部分完全残留我.
我发现这篇关于Numpy滚动窗口的博文,但它似乎不适用于1D阵列.