2011-08-31 64 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

對不起。個人偏見,我猜。 –