Haz una matriz numpy monotónica sin un bucle de Python

Tengo una matriz de valores 1D que se supone que es monotónica (digamos que disminuye), pero hay regiones aleatorias donde el valor aumenta con el índice.

Necesito una matriz donde se reemplaza cada región con un valor que la precede directamente, de modo que la matriz resultante se ordene.

Así que si la matriz dada es:

a = np.array([10.0, 9.5, 8.0, 7.2, 7.8, 8.0, 7.0, 5.0, 3.0, 2.5, 3.0, 2.0]) 

Quiero que el resultado sea

 b = np.array([10.0, 9.5, 8.0, 7.2, 7.2, 7.2, 7.0, 5.0, 3.0, 2.5, 2.5, 2.0]) 

Aquí hay una representación gráfica:

ejemplo

Sé cómo lograrlo con un bucle de Python, pero ¿hay alguna forma de hacerlo con la maquinaria NumPy?

Código de Python para mayor claridad:

 b = np.array(a) for i in range(1, b.size): if b[i] > b[i-1]: b[i] = b[i-1] 

Puede usar np.minimum.accumulate para recostackr los valores mínimos a medida que se mueve a través de la matriz:

 >>> np.minimum.accumulate(a) array([ 10. , 9.5, 8. , 7.2, 7.2, 7.2, 7. , 5. , 3. , 2.5, 2.5, 2. ]) 

En cada elemento de la matriz, esta función devuelve el valor mínimo visto hasta ahora.

Si quisiera que un array fuera monótono en aumento, podría usar np.maximum.accumulate .

Muchas otras funciones universales en NumPy tienen un método de accumulate para simular el bucle a través de una matriz, aplicando la función a cada elemento y recolectando los valores devueltos en una matriz del mismo tamaño.