Здесь можно использовать трюк, используя cumsum(..)
[numpy-doc] и diff()
[numpy-doc]:
import numpy as np
def hold(iterable, condition):
cond = np.array(condition)
vals = np.array(iterable)
a = vals * cond
a[cond] = np.diff(np.hstack(((0,), a[cond])))
return a.cumsum()
Первый параметр - это iterable
, содержащий элементы, второй параметр condition
- это итерация той же длины с логическими значениями.
Например,:
>>> a
array([-2, 0, 0, -1, 0, 0, 0, 3, 0, 0])
>>> hold(a, a != 0)
array([-2, -2, -2, -1, -1, -1, -1, 3, 3, 3])
>>> hold(a, a != 0)
array([-2, -2, -2, -1, -1, -1, -1, 3, 3, 3])
Функция работает следующим образом.Сначала мы делаем копию двух итераций (и конвертируем их в массивы, если это еще не так).Вы можете не указывать, что если это пустые массивы.
Далее мы выполняем поэлементное умножение, чтобы значения, в которых выполняется условие , а не , содержали ноль.
Затем мы вычисляемразница между каждым элементом, где выполняется условие, и следующим, и мы устанавливаем это a
.Наконец, мы можем использовать кумулятивную сумму a
, поскольку .diff()
гарантирует, что это приведет к правильным повторениям.