2011-08-31 29 views
21

我需要一种快速方法来保持numpy数组的运行最大值。例如,如果我的数组是:运行最大numpy数组值

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

我会想:

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

很显然,我可以用一个小圈做到这一点:

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 

但我的阵列有上百成千上万的条目,我需要多次打电话。看起来似乎有一个移除循环的技巧,但我似乎无法找到任何可行的方法。另一种方法是将其写成C扩展名,但似乎我会重新发明轮子。

+0

我会说,累计最大 - 运行最大值向我建议一个窗口。不幸的是,谷歌搜索没有提供任何有用的信息。 –

+1

我没有安装numpy,但max.accumulate可能工作。检查文档中的“累积”。 –

+0

@andrew max在numpy中没有累积属性。如果有的话,那将是一个很好的内置解决方案。 – JoshAdel

回答

34

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

在我做之前,wim就到了那里。 –

4

至于建议,有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

没有必要从scipy命名空间获取它。这是一个numpy ufunc。 scipy。*中的numpy符号的重复是数字时代的后向兼容性剩余。 –

+0

对不起。个人偏见,我猜。 –