Итератор с скользящим или скользящим окном?

Мне нужно скользящее окно (также известное как скользящее окно), которое может повторяться через последовательность / итератор / генератор. Итерацию 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]
"""
142
задан martineau 17 November 2017 в 04:32
поделиться

1 ответ

вот один лайнер. Я синхронизировал его, и это comprable к производительности главного ответа и прогрессивно становится лучше с большим seq от на 20% медленнее с len (seq) = 20 и на 7% медленнее с len (seq) = 10000

zip(*[seq[i:(len(seq) - 1 + i)] for i in range(n)])
0
ответ дан 23 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: