2011-08-31 18 views
21

Sayısal bir dizi en yüksek seviyede tutmanın hızlı bir yoluna ihtiyacım var. Örneğin, benim dizi halinde idi:Sayısal dizi değerlerinin azami olarak çalıştırılması

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

Ben isterdim:

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 

Ama diziler yüzlerce:

Açıkçası
numpy.array([11,12,13,20,20,20,20,20,23,23]) 

biraz döngü ile bu yapabileceğini binlerce giriş ve bunu defalarca aramam lazım. Döngüyü kaldırmak için uyuşmuş bir numara olmalı gibi görünüyor, ama çalışacak bir şey bulamıyorum. Alternatif, bunu bir C uzantısı olarak yazmak olacaktır, ancak tekerleği yeniden icat ediyor gibi görünüyor. önerildiği gibi

+0

Kümülatif maksimum - çalışan maksimum, bana bir pencere önerir. Ne yazık ki bunun için yararlı bir şey ortaya çıkmaz. –

+1

Ben numpy yüklü değil, ancak max.accumulate işe yarayabilir. Dokümanlarda "biriktir" seçeneğini işaretleyin. –

+0

@andrew max'ın numpy hesabında bir birikme özelliği yok. Bu olsa iyi bir yerleşik çözüm olurdu. – JoshAdel

cevap

34

numpy.maximum.accumulate çalışır.

>>> 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, benden hemen önce oradaydı. –

4

, scipy.maximum.accumulate vardır: Benim için

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 ad alanından almanıza gerek yok. Bu ufak bir ufunc. Saygısız sembollerin scipy'de kopyalanması *, Sayısal günlerden geriye doğru bir uyumluluktur. –

+0

Bunun için üzgünüz. Kişisel önyargı, sanırım. –

İlgili konular