首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建一个滑动窗口,从较小数组的末尾开始,在python中的较小数组开始时结束?

如何创建一个滑动窗口,从较小数组的末尾开始,在python中的较小数组开始时结束?
EN

Stack Overflow用户
提问于 2021-06-08 17:58:36
回答 3查看 315关注 0票数 0

我有两个数组:

代码语言:javascript
运行
复制
[7, 6, 9, 8]
[1, 2, 3, 4, 5, 3, 2, 1]

我想这样滑过它们:

迭代1:

代码语言:javascript
运行
复制
[7, 6, 9, |8|]
         [|1|, 2, 3, 4, 5, 3, 2, 1]

2:

代码语言:javascript
运行
复制
[7, 6, |9, 8|]
      [|1, 2|, 3, 4, 5, 3, 2, 1]

3:

代码语言:javascript
运行
复制
    [7,|6, 9, 8|]
      [|1, 2, 3|, 4, 5, 3, 2, 1]

4:

代码语言:javascript
运行
复制
      [|7, 6, 9, 8|]
      [|1, 2, 3, 4|, 5, 3, 2, 1]

5:

代码语言:javascript
运行
复制
         [|7, 6, 9, 8|]
      [1, |2, 3, 4, 5|, 3, 2, 1]

它一直保持第一个数组的长度直到.

迭代9:

代码语言:javascript
运行
复制
                      [|7, 6, 9|, 8|]
       [1, 2, 3, 4, 5, |3, 2, 1|]

10:

代码语言:javascript
运行
复制
                         [|7, 6|, 9, 8|]
       [1, 2, 3, 4, 5, 3, |2, 1|]

11:

代码语言:javascript
运行
复制
                            [|7|, 6, 9, 8|]
       [1, 2, 3, 4, 5, 3, 2, |1|]

我已经试过什么了?一堆乱七八糟的东西根本不起作用,我担心分享它会使许多人甚至不敢做出反应。

编辑:这是我为那些想看它的人编写的非工作代码:

代码语言:javascript
运行
复制
embedding_list_1 = [[1, 2, 3], [1, 3, 4], [1, 2, 4]]
embedding_list_2 = [[1, 2, 3], [1, 3, 4], [1, 2, 4], [1, 2, 4], [1, 2, 4], [3, 4, 5]]
region_range = 1
first_run = True
increment = True
embedding_list_2_start = 0

embedding_list_2_end = len(embedding_list_1)
while region_range >= 0:
  if first_run:
    print('Cutting embedding list 1 from:', len(embedding_list_1)-region_range, 'to', len(embedding_list_1))
    print(embedding_list_1[len(embedding_list_1)-region_range:])
    print('Cutting embedding list 2 from:', 0, 'to', region_range)
    embedding_list_2[:region_range]
    region_range +=1
    first_run = False
  else:
    

    chopped_off = embedding_list_1[len(embedding_list_1)-region_range:]
    print(chopped_off)

    embedding_list_2[embedding_list_2_start:region_range]
    if increment:
      region_range +=1

    
    if region_range == len(embedding_list_1):
      #break
      #use full list 
      
      print(len(embedding_list_1))
      embedding_list_2_start+=1
      embedding_list_2_end+=1
      print('Cutting embedding list 2 from', embedding_list_2_start, 'to', embedding_list_2_end)
      print(embedding_list_2[embedding_list_2_start:embedding_list_2_end])
      increment = False

      

      if embedding_list_2_end == len(embedding_list_2):
        #Stop incrementing end
        #Start negative shift for other embedding
        region_range-=1
        print('Cutting embedding list 1 from: 0', 'to', region_range)
        embedding_list_1[0:region_range]

        embedding_list_2_start+=1
        embedding_list_2_end+=1
        print('cuting embedding list 2 from:', embedding_list_2_start, embedding_list_2_end)
        embedding_list_2[:embedding_list_2_end]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-08 21:11:16

这是一个快速的,可能是相当肮脏的尝试。

在第一次迭代中,重叠如下所示:

让我们先看一下与list2相关的所有内容。在第一次迭代中

代码语言:javascript
运行
复制
# Calculate the offset between the two lists
offset = 1 - len(list1) # -3

l2_window_start = offset
l2_window_end = 0

# The slice for list2 starts at the larger of 0 and l2_window_start
l2_start = max(0, l2_window_start)
# The slice for list2 ends at the smaller of 7 and l2_window_end
l2_end = min(len(list2) - 1, l2_window_end)

# Add one to l2_end because slices don't contain the end index.
list2_slice = list2[l2_start:l2_end+1]

现在,使用以下数字查看list1

代码语言:javascript
运行
复制
l1_window_start = -offset # starts off at 3

l1_start = max(0, l1_window_start)
# list1 slice needs to have as many elements as list2_slice
l1_end = l1_start + len(list2_slice)

list1_slice = list1[l1_start:l1_end]

随着迭代的推进,l2_window_startl2_window_endoffset都增加了1,l1_window_start减少了1。

把它循环起来:

代码语言:javascript
运行
复制
list1 = [7, 6, 9, 8]
list2 = [1, 2, 3, 4, 5, 3, 2, 1]
offset = l2_window_start = 1 - len(list1) # -3
l2_window_end = 0
l1_window_start = -offset
l1_window_end = len(list1) - 1
for iternum in range(11):
    # The slice for list2 starts at the larger of 0 and l2_window_start
    l2_start = max(0, l2_window_start)
    # The slice for list2 ends at the smaller of 7 and l2_window_end
    l2_end = min(len(list2) - 1, l2_window_end)
    
    # Add one to l2_end because slices don't contain the end index.
    list2_slice = list2[l2_start:l2_end+1]

    l1_start = max(0, l1_window_start)
    l1_end = l1_start + len(list2_slice)
    
    list1_slice = list1[l1_start:l1_end]    

    print(iternum+1, list1_slice, list2_slice)
    l1_window_start -= 1;
    l2_window_start += 1; l2_window_end += 1; offset += 1

这为我们提供了所需的输出:

代码语言:javascript
运行
复制
1 [8] [1]
2 [9, 8] [1, 2]
3 [6, 9, 8] [1, 2, 3]
4 [7, 6, 9, 8] [1, 2, 3, 4]
5 [7, 6, 9, 8] [2, 3, 4, 5]
6 [7, 6, 9, 8] [3, 4, 5, 3]
7 [7, 6, 9, 8] [4, 5, 3, 2]
8 [7, 6, 9, 8] [5, 3, 2, 1]
9 [7, 6, 9] [3, 2, 1]
10 [7, 6] [2, 1]
11 [7] [1]
票数 3
EN

Stack Overflow用户

发布于 2021-06-08 21:43:03

我的解决方案与@pranav-hosangadi的答案非常相似(可能最终是相同的)。我产生了一个稍微不同的结果,因为我的答案基于对每个列表中的窗口元素进行配对生成元组。

与@pranav-hosangadi的答案一样,我们从涵盖整个幻灯片的范围开始。最棘手的部分(至少对我来说)是正确的开始和结束。

代码语言:javascript
运行
复制
a = [7, 6, 9, 8]
b = [1, 2, 3, 4, 5, 3, 2, 1]

a_len = len(a)
b_len = len(b)

for i in range(0, a_len + b_len -1):
  a_start = max(0, a_len -i -1)
  a_end = min(a_len, a_len + b_len - i)
  b_start = max(0, i + 1 - a_len)
  b_end = min(i + 1, b_len)
  result = [(a[x], b[y]) for (x, y) in zip(range(a_start, a_end), range(b_start, b_end))]
  print(result)

这会产生稍微不同的(错误?)产出:

代码语言:javascript
运行
复制
[(8, 1)]
[(9, 1), (8, 2)]
[(6, 1), (9, 2), (8, 3)]
[(7, 1), (6, 2), (9, 3), (8, 4)]
[(7, 2), (6, 3), (9, 4), (8, 5)]
[(7, 3), (6, 4), (9, 5), (8, 3)]
[(7, 4), (6, 5), (9, 3), (8, 2)]
[(7, 5), (6, 3), (9, 2), (8, 1)]
[(7, 3), (6, 2), (9, 1)]
[(7, 2), (6, 1)]
[(7, 1)]
票数 2
EN

Stack Overflow用户

发布于 2021-06-09 00:12:32

这里有一个略有不同的变化,使用zip函数;

代码语言:javascript
运行
复制
l1 = [7, 6, 9, 8]
l2 = [1, 2, 3, 4, 5, 3, 2, 1]

def slide(la, lb):
    lxa = []
    lxa = [x for x in range(len(la))]
    lxa.extend([None]* (len(lb) - 1))
    lxb = [None] * (len(la) -1)
    lxb.extend([x for x in range(len(lb))])
    lxcnt = 0
    rslt = []
    while lxcnt < len(lxa):
        tmp = []
        matchs = zip(lxa, lxb)
        for mtch in matchs:
            if mtch[0] != None and mtch[1] != None:
                tmp.append(mtch)
        if tmp:
            rslt.append(tmp)
        lxa.insert(0, None)
        lxa = lxa[:-1]
        lxcnt += 1
    return rslt

运行slide(l1, l2),则会产生:

代码语言:javascript
运行
复制
[[(3, 0)], 
[(2, 0), (3, 1)], 
[(1, 0), (2, 1), (3, 2)], 
[(0, 0), (1, 1), (2, 2), (3, 3)], 
[(0, 1), (1, 2), (2, 3), (3, 4)], 
[(0, 2), (1, 3), (2, 4), (3, 5)], 
[(0, 3), (1, 4), (2, 5), (3, 6)], 
[(0, 4), (1, 5), (2, 6), (3, 7)], 
[(0, 5), (1, 6), (2, 7)], 
[(0, 6), (1, 7)], 
[(0, 7)]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67892286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档