Вот подход, использующий сочетание np.maximum.accumulate
и np.where
создать ступенчатые показатели, которые должны быть остановлены через определенные промежутки времени, а затем просто индексации в b
даст нам желаемый результат.
Таким образом, реализация будет -
mask = a!="b"
idx = np.maximum.accumulate(np.where(mask,np.arange(mask.size),0))
out = b[idx]
Пример шаг за шагом пробег -
In [656]: # Inputs
...: a = np.array(['a', 'b', 'a', 'a', 'b', 'a'])
...: b = np.array([150, 154, 147, 126, 148, 125])
...:
In [657]: mask = a!="b"
In [658]: mask
Out[658]: array([ True, False, True, True, False, True], dtype=bool)
# Crux of the implmentation happens here :
In [696]: np.where(mask,np.arange(mask.size),0)
Out[696]: array([0, 0, 2, 3, 0, 5])
In [697]: np.maximum.accumulate(np.where(mask,np.arange(mask.size),0))
Out[697]: array([0, 0, 2, 3, 3, 5])# Stepped indices "intervaled" at masked places
In [698]: idx = np.maximum.accumulate(np.where(mask,np.arange(mask.size),0))
In [699]: b[idx]
Out[699]: array([150, 150, 147, 126, 126, 125])
Это простое и краткое решение. Но почему он возвращает [150 0 147 126 0 125]? Он не принимает значения из массива «b», где a [i] = «b». –
Я неправильно понял вопрос, это работает только в том случае, если у вас уже есть все элементы 'c', но вы заполняете его через цикл, поэтому он делает его немного сложнее, чем это – pbreach