代码之家  ›  专栏  ›  技术社区  ›  Ricky

如何将数组切片为序列数组?

  •  0
  • Ricky  · 技术社区  · 6 年前

    我有一个功能和标签的时间序列数组

    x=[1,2,3,4,5,6......100]
    y=[0.5,0.8,0.9,0.5,0.9,0.8,....,0.9]
    

    x=[1,2,3],[2,3,4],[3,4,5],...
    y=[0.5,0.8,0.9],[0.8,0.9,0.5],[0.9,0.5,0.9],...
    

    t[1:i] 感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  3
  •   lightalchemist    6 年前

    你想要的是一种从序列中计算滑动窗口的方法。

    Rolling or sliding window iterator? 作者:@Daniel DiPaolo

    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 = list(islice(it, n))
        if len(result) == n:
            yield result
        for elem in it:
            result = result[1:] + [elem]
            yield result
    
    from functools import partial
    
    def group_slice(*args, winsize):
        yield from zip(*map(partial(window, n=winsize), args))
    
    def group_slice(*args, winsize):
         # Slightly clearer version of the above 
         partial_func = partial(window, n=winsize)
         yield from zip(*(partial_func(s) for s in args))
    

    group_slice 是在做什么

    1. window 给定值为 窗口大小。

    2. 应用此部分“已修改” 窗口 函数到每个序列到

    3. 然后从每个生成器生成每个片。

    x = [1,2,3,4,5,6]
    y = [0.5,0.8,0.9,0.5,0.9,0.8]
    
    for x_slice, y_slice in group_slice(x, y, winsize=3):
        print(x_slice)
        print(y_slice)
    

    它将输出

    [1, 2, 3]
    [0.5, 0.8, 0.9]
    [2, 3, 4]
    [0.8, 0.9, 0.5]
    [3, 4, 5]
    [0.9, 0.5, 0.9]
    [4, 5, 6]
    [0.5, 0.9, 0.8]
    

    或者如果你只需要一个小组的名单

    x_slices = list(window(x, n=3))