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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.