如何在Python中创建大小不同的滑动窗口?

时间:2019-04-18 03:54:15

标签: python numpy

我有一个清单清单。例如:

a = [[38, 2, 33, 8, 17, 8, 39, 36, 34, 17, 26, 22, 10, 2, 37, 17, 33, 2, 23, 40, 38, 0, 40, 14, 3, 30],
[38, 20, 31, 33, 0, 30, 33, 2, 8, 34, 30, 36, 10, 2, 38, 35, 8, 40, 0, 25, 2, 30, 2, 25]]

此列表包含大约200个子列表(我提供了2个)。我正在寻找一种输出包含滑动窗口的数组的方法,该滑动窗口具有任意数量的前后值。例如,使用两个前面的值和三个下面的值,我试图得到:

[[_, _, 38, 2, 33, 8],
[_, 38, 2, 33, 8, 17],
[38, 2, 33, 8, 17, 9],
...,
[14, 3, 30, _, _, _,],
[_, _, 38, 20, 31, 33],
...]

我将需要重复多次此操作(对于不同的子列表),因此速度很重要。我的印象是,将数据转换为Numpy数组以使用答案here可能太慢(由于每个列表的长度不同,我猜我需要实例化多个np.arrays)。有没有很好的方法可以做到这一点?谢谢!

1 个答案:

答案 0 :(得分:0)

我相当确定这是最快的方法。

def f(b):
    ret = []

    for sublist in b:
        ret.append(["_","_"] + sublist[0:4])
        ret.append(["_"] + sublist[0:5])
        for i in range(len(sublist)-4):
            ret.append(sublist[i:i+5])
        ret.append(sublist[-4:] + ["_"])
        ret.append(sublist[-3:] + ["_", "_"])
        ret.append(sublist[-2:] + ["_", "_", "_"])
    return ret

很显然,您必须迭代每个子列表才能真正达到所需的结果,并且对于每个子列表,您必须对其进行n次迭代才能生成n个列表,因此,我相当确定这一点(o(n ^ 2))是最快的获取方式。