微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在python中创建一个从较小数组的末尾开始并在较小数组的开头结束的滑动窗口?

我有 2 个数组:

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

我想像这样滑过它们:

迭代 1:

[7,|8|]
         [|1|,1]

2:

[7,|9,8|]
      [|1,2|,1]

3:

    [7,|6,3|,1]

4:

      [|7,4|,1]

5:

         [|7,8|]
      [1,|2,5|,1]

并且它一直在第一个数组的长度处直到...

迭代 9:

                      [|7,9|,8|]
       [1,|3,1|]

10:

                         [|7,6|,1|]

11:

                            [|7|,|1|]

我已经尝试过什么?一团糟是行不通的,我担心分享它会使许多人甚至不愿做出回应。

编辑:这是我的非工作代码,供想要查看的人使用:

embedding_list_1 = [[1,3],[1,4],4]]
embedding_list_2 = [[1,[3,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:',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,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',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_end)
        embedding_list_2[:embedding_list_2_end]

解决方法

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

第一次迭代中的重叠看起来像这样:

iteration 1 illustration

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

# 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

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。

将其置于循环中:

list1 = [7,6,9,8]
list2 = [1,2,3,4,5,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

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

1 [8] [1]
2 [9,8] [1,2]
3 [6,3]
4 [7,4]
5 [7,8] [2,5]
6 [7,8] [3,3]
7 [7,8] [4,2]
8 [7,8] [5,1]
9 [7,9] [3,1]
10 [7,6] [2,1]
11 [7] [1]

,

我的解决方案与@pranav-hosangadi 的答案非常相似(可能最终相同)。我产生了略有不同的结果,因为我的答案会根据每个列表中的窗口元素配对来产生元组。

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

a = [7,8]
b = [1,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)

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

[(8,1)]
[(9,1),(8,2)]
[(6,(9,2),3)]
[(7,(6,3),4)]
[(7,4),5)]
[(7,5),2)]
[(7,1)]
[(7,1)]
,

这是使用 zip 函数的稍微不同的变体;

dataTask

运行 let result = try JSONSerialization.jsonObject(with: data) as! [String:Any] ,收益:

l1 = [7,8]
l2 = [1,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。