2011-08-31 21 views
21

Necesito una forma rápida de mantener un máximo de ejecución de una matriz numpy. Por ejemplo, si mi arsenal era:Ejecución del máximo de los valores numpy de la matriz

x = numpy.array([11,12,13,20,19,18,17,18,23,21]) 

me gustaría:

numpy.array([11,12,13,20,20,20,20,20,23,23]) 

Obviamente, podría hacer esto con un poco de bucle:

def running_max(x): 
    result = [x[0]] 
    for val in x: 
     if val > result[-1]: 
      result.append(val) 
     else: 
      result.append(result[-1]) 
    return result 

Pero mis matrices tener cientos de miles de entradas y necesito llamar esto muchas veces. Parece que debe haber un truco numpy para eliminar el loop, pero parece que no puedo encontrar nada que funcione. La alternativa será escribir esto como una extensión C, pero parece que estaría reinventando la rueda.

+0

yo diría que el max acumulativo max - running max me sugiere una ventana. Desafortunadamente, buscar en Google no aporta nada útil. –

+1

no tengo Numpy instalado, pero max.accumulate podría funcionar. revisa "acumular" en los documentos. –

+0

@andrew max no tiene un atributo de acumulación en numpy. Sin embargo, eso hubiera sido una buena solución incorporada. – JoshAdel

Respuesta

34

numpy.maximum.accumulate funciona para mí.

>>> import numpy 
>>> numpy.maximum.accumulate(numpy.array([11,12,13,20,19,18,17,18,23,21])) 
array([11, 12, 13, 20, 20, 20, 20, 20, 23, 23]) 
+0

wim llegó justo antes que yo. –

4

Como se ha sugerido, hay scipy.maximum.accumulate:

In [9]: x 
Out[9]: [1, 3, 2, 5, 4] 

In [10]: scipy.maximum.accumulate(x) 
Out[10]: array([1, 3, 3, 5, 5]) 
+4

No hay necesidad de obtenerlo del espacio de nombres scipy. Es un ufunc numpy. La duplicación de los símbolos numpy en scipy. * Es un remanente de compatibilidad de los días de Numeric. –

+0

Perdón por eso. Prejuicio personal, supongo. –

Cuestiones relacionadas