gpt4 book ai didi

python - 滚动或滑动窗口迭代器?

转载 作者:IT老高 更新时间:2023-10-28 12:31:18 26 4
gpt4 key购买 nike

我需要一个可在序列/迭代器/生成器上迭代的滚动窗口(又名滑动窗口)。 (默认 Python 迭代可以被认为是一种特殊情况,其中窗口长度为 1。)我目前正在使用以下代码。我怎样才能更优雅和/或更高效地做到这一点?

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]
"""

对于 window_size == 2特定情况(即迭代序列中相邻的重叠对),另请参阅 Iterate a list as pair (current, next) in Python .

最佳答案

旧版本的 Python 文档中有一个 itertools examples :

from itertools import islice

def window(seq, n=2):
"Returns a sliding window (of width n) over data from the iterable"
" s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result

文档中的那个更简洁一些,并使用 itertools 来达到我想象的更大效果。


如果您的迭代器是一个简单的列表/元组,以指定的窗口大小在其中滑动的简单方法是:

seq = [0, 1, 2, 3, 4, 5]
window_size = 3

for i in range(len(seq) - window_size + 1):
print(seq[i: i + window_size])

输出:

[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]

关于python - 滚动或滑动窗口迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6822725/

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