2011-08-31 15 views
21

Ho bisogno di un modo rapido per mantenere un massimo di un array Numpy. Ad esempio, se il mio array è stato:Numero massimo di valori di array numpy

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

che vorrei:

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

Ovviamente avrei potuto farlo con un po 'di ciclo:

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 

Ma le mie matrici avere centinaia di migliaia di voci e ho bisogno di chiamare questo molte volte. Sembra che debba esserci un trucco per liberare il loop, ma non riesco a trovare nulla che funzioni. L'alternativa sarà scrivere come estensione C, ma sembra che reinventerò la ruota.

+0

direi che il massimo cumulativo di corsa massima suggerisce una finestra per me. sfortunatamente googling per quello non rivela nulla di utile. –

+1

Non ho installato numpy, ma potrebbe funzionare max.accumulate. controlla "accumula" nei documenti. –

+0

@andrew max non ha un attributo di accumulo in numpy. Sarebbe stata una buona soluzione integrata se lo avesse fatto. – JoshAdel

risposta

34

numpy.maximum.accumulate funziona per me.

>>> 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

siamo arrivati ​​appena prima di me. –

4

Come suggerito, c'è 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

Non è necessario scaricarlo dallo spazio dei nomi scipy. È un po 'ufunc. La duplicazione dei simboli numpy in scipy * è un residuo retrocompatibile dei giorni di Numeric. –

+0

Mi dispiace per quello. Pregiudizi personali, immagino. –