48

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.

5
  • i would call that the cumulative max - running max suggests a window to me. unfortunately googling for that doesn't turn up anything useful. Commented Aug 31, 2011 at 0:54
  • 1
    i don't have numpy installed, but max.accumulate might work. check out "accumulate" in the docs. Commented Aug 31, 2011 at 0:56
  • @andrew max doesn't have an accumulate attribute in numpy. That would have been a good built-in solution though if it did. Commented Aug 31, 2011 at 1:01
  • 7
    @JoshAdel: numpy.maximum.accumulate Commented Aug 31, 2011 at 1:12
  • tiny, tiny correction to the for loop, I think it should read for val in x[1:]: Commented May 13, 2024 at 13:01

2 Answers 2

83

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]) 
Sign up to request clarification or add additional context in comments.

1 Comment

wim got there just before I did.
3

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

2 Comments

There is no need to get it from the scipy namespace. It's a numpy ufunc. The duplication of the numpy symbols in scipy.* is a backwards-compatibility leftover from the days of Numeric.
Sorry about that. Personal bias, I guess.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.