# Running maximum of numpy array values

8.4k Views

I need a fast way to keep a running maximum of a numpy array. For example, if my array was:

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

I'd want:

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

Obviously I could do this with a little loop:

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

But my arrays have hundreds of thousands of entries and I need to call this many times. It seems like there's got to be a numpy trick to remove the loop, but I can't seem to find anything that will work. The alternative will be to write this as a C extension, but it seems like I'd be reinventing the wheel.

• 2
• i would call that the cumulative max - running max suggests a window to me. unfortunately googling for that doesn't turn up anything useful.
• 1
• i don't have numpy installed, but max.accumulate might work. check out "accumulate" in the docs.
• 2
• @andrew max doesn't have an accumulate attribute in numpy. That would have been a good built-in solution though if it did.
• 2
• @JoshAdel: `numpy.maximum.accumulate`

`numpy.maximum.accumulate` works for 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])
``````
• wim got there just before I did.

As suggested, there is `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])
``````