提问者:小点点

如何获得每个元素在两个方向(向前,向后)的滑动窗口值?


我有一个像这样的值列表,

lst = [1, 2, 3, 4, 5, 6, 7, 8]

所需输出:

window size = 3
    1  # first element in the list
    forward = [2, 3, 4]
    backward = []

    2  # second element in the list
    forward = [3, 4, 5]
    backward = [1]

    3  # third element in the list
    forward = [4, 5, 6]
    backward = [1, 2]

    4  # fourth element in the list
    forward = [5, 6, 7]
    backward = [1, 2, 3]

    5  # fifth element in the list
    forward = [6, 7, 8]
    backward = [2, 3, 4]

    6  # sixth element in the list
    forward = [7, 8]
    backward = [3, 4, 5]

    7  # seventh element in the list
    forward = [8]
    backward = [4, 5, 6]

    8  # eight element in the list
    forward = []
    backward = [5, 6, 7]

让我们假设窗口大小为4,现在我想要的输出:

对于列表中的each_element,我希望前面有4个值,后面有4个值,忽略当前值。

我可以用它来获得值的滑动窗口,但这也不能给出正确的所需输出。

import more_itertools
list(more_itertools.windowed([1, 2, 3, 4, 5, 6, 7, 8], n=3))

共3个答案

匿名用户

方法1:枚举

较短的方法

代码:

window = 3
for backward, current in enumerate(range(len(arr)), start = 0-window):
    if backward < 0:
        backward = 0
    print(arr[current+1:current+1+window], arr[backward:current])

输出:

[2, 3, 4], []
[3, 4, 5], [1]
[4, 5, 6], [1, 2]
[5, 6, 7], [1, 2, 3]
[6, 7, 8], [2, 3, 4]
[7, 8], [3, 4, 5]
[8], [4, 5, 6]
[], [5, 6, 7]

另一种方法

方法2:

代码:

arr = [1, 2, 3, 4, 5, 6, 7, 8]
window=3

for i in range(len(arr)):
    forward = i + 1 + window
    backward = i - window 
    if backward < 0:
        backward =0 
    print(arr[i+1:forward], arr[backward:i])

输出:

[2, 3, 4] []
[3, 4, 5] [1]
[4, 5, 6] [1, 2]
[5, 6, 7] [1, 2, 3]
[6, 7, 8] [2, 3, 4]
[7, 8] [3, 4, 5]
[8] [4, 5, 6]
[] [5, 6, 7]

匿名用户

这应该会让你开始:

from dataclasses import dataclass
from typing import List

@dataclass
class Window:
  index: int
  backward: List[int]
  forward: List[int]

def window(iterable, window_size, index):
  backward = iterable[max(0, index - window_size):index]
  forward = iterable[index + 1:min(len(iterable) - 1, index + 1 + window_size)]
  return Window(index, backward, forward)
>>> window([1,2,3,4,5,6], 3, 0)
Window(index=0, backward=[], forward=[2, 3, 4])
>>> window([1,2,3,4,5,6], 3, 5)
Window(index=5, backward=[3, 4, 5], forward=[])

我还将添加一些检查索引和窗口大小是否有意义。

匿名用户

下面是一段简短,简洁,经过测试的代码

l = [1,2,3,4,5,6,7,8]
window = 3

forward = [l[i+1:i+1+window] for i in range(len(l)]
backward = [l[::-1][i+1:i+1+window] for i in range(len(l)] # first reverse the input list and do same as did in forward
out = zip(forward,backward[::-1]) # first reverse the backward list and zip two list into one

输出量

>>> forward
[[2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8], [8], []]
>>> backward
[[7, 6, 5], [6, 5, 4], [5, 4, 3], [4, 3, 2], [3, 2, 1], [2, 1], [1], []]
>>> out
[([2, 3, 4], []), ([3, 4, 5], [1]), ([4, 5, 6], [2, 1]), ([5, 6, 7], [3, 2, 1]), ([6, 7, 8], [4, 3, 2]), ([7, 8], [5, 4, 3]), ([8], [6, 5, 4]), ([], [7, 6, 5])]