Как создать скользящее окно в Python с разными размерами? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть список списков.Например:

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 для использования ответа здесь может быть слишком медленным (поскольку каждый список имеет разную длину, я предполагаю, что мне нужно создать несколько np.arrays).Есть хороший способ сделать это?Спасибо!

1 Ответ

0 голосов
/ 18 апреля 2019

Я вполне уверен, что это самый быстрый способ сделать это.

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)) - самый быстрый способ получить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...