Имеется одномерный массив данных с длиной 100_000 элементов. Требуется написать код для перебора этого массива на серии, все элементы которых больше 0. При этом требуемая длина серий - от 100 и выше. Серии, длина которых меньше 100, "зануляются". Результат перебора записывается в список result.
Далее для удобстав представления привожу код перебора под упрощённые условия:
arr = np.array([0, 7, 1, 0, 4, 2, 5, 4, 0, 9, 0, 3])
В данном массиве сериями выступают
[7,1]
и
[4,2,5,4]
.
В этом примере необходимо найти серии, длина которых 3 и более.
Результат выполнения кода должен быть следующим:
array_ = [0, 7, 1, 0, 4, 2, 5, 4, 0, 9, 0, 3] (было)
result = [0, 0, 0, 0, 4, 2, 5, 4, 0, 0, 0, 0] (должно стать)
Текущее решение основывается на прохождение по всему массиву "окном" (шаблон серии), длина которого 3:
import numpy as np
arr = np.array([0, 7, 1, 0, 4, 2, 5, 4, 0, 9, 0, 3])
window = 3
result = list()
origin = 0
for i in range(len(arr)):
seria_start = origin
seria_end = seria_start + window
if seria_end <= len(arr):
data = arr[origin:seria_end]
if all([x > 0 for x in data]):
array = arr[i:i+window]
for elem in array:
result.append(elem)
pass
else:
result.append(0)
origin += 1
pass
print('array_:', list(arr))
print('result:', result)
Однако результат выполнения кода отличается от ожидаемого:
array_: [0, 7, 1, 0, 4, 2, 5, 4, 0, 9, 0, 3]
result: [0, 0, 0, 0, 4, 2, 5, 2, 5, 4, 0, 0, 0, 0]
Если указать
window = 4
, то это решит задачу под упрощённые условия, но это не совсем то, что мне нужно. Сложность в том, что мне не нужно "вручную" ковыряться, чтобы узнать сколько будет серий среди массива со 100_000 элементов и какой они длины; требуется найти решение, которое позволит получить список только с теми элементами, длина серии с которыми которых более 100 (автоматизированный поиск).
Что подправить в коде, чтобы решить задачу как с упрощённым условием, так и с изначальным, регулируя переменную window? Прошу помочь разобраться.