Вот один из способов использования numpy и понимания списка:
In [23]: a = np.array([0,0,1,1,1,0,0,0,0,1,1,0,0])
In [24]: np.hstack([x.sum() if x[0] == 1 else x for x in np.split(a, np.where(np.diff(a) != 0)[0]+1)])
Out[24]: array([0, 0, 3, 0, 0, 0, 0, 2, 0, 0])
Логика:
- Найдите ведущие и конечные индексы того, где у вас есть последствия 1с.
- Разделите ваш массив по этим индексам
- суммирует те подсписки, которые имеют один, и оставляют подсписки с нулем, как они есть
- выровнять результат, используя
np.hstack
.
Если вы хотите заменить оставшиеся на 0, просто сделайте следующее:
In [28]: np.hstack([[x.sum(), *[0]*(len(x) -1)] if x[0] == 1 else x for x in np.split(a, np.where(np.diff(a) != 0)[0]+1)])
Out[28]: array([0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0])
[0]*(len(x) -1)
создаст для вас ожидаемые 0, а с помощью распаковки на месте вы сможете разместить их рядом с sum(x)
.
Если вы когда-либо хотели чистый подход к Python, вот один из способов, используя itertools.groupby
:
In [63]: def summ_cons(li):
...: for k,g in groupby(li) :
...: if k:
...: s = sum(g)
...: yield s
...: yield from (0 for _ in range(s-1))
...: yield from g
...:
In [65]: list(summ_cons(a))
Out[65]: [0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0]