I need a fast way to keep a running maximum of a numpy array. For example, if my array was:
我需要一种快速的方法来保持numpy数组的运行最大值。例如,如果我的数组是:
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.
但是我的阵列有数十万个条目,我需要多次调用它。似乎必须有一个笨拙的技巧来删除循环,但我似乎找不到任何可行的东西。另一种方法是将其写为C扩展,但似乎我要重新发明*。
2 个解决方案
#1
37
numpy.maximum.accumulate
works for me.
numpy.maximum.accumulate适合我。
>>> 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])
#2
3
As suggested, there is scipy.maximum.accumulate
:
正如所建议的,有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])
#1
37
numpy.maximum.accumulate
works for me.
numpy.maximum.accumulate适合我。
>>> 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])
#2
3
As suggested, there is scipy.maximum.accumulate
:
正如所建议的,有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])