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

私はmax-running maxの累積が私にウィンドウを示唆していると言います。残念ながらそれでグーグルでは何も役に立たない。 –

+1

numpyがインストールされていませんが、max.accumulateが動作する可能性があります。ドキュメントに「蓄積」をチェックしてください。 –

+0

@andrew maxにはnumpyにaccumulate属性がありません。もしそれがあったとしても、それは良い組み込みのソリューションでした。 – 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

ウィムは私の前にそこに着いた。 –

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名前空間から取得する必要はありません。それは愚かなufuncです。 scipy。*のnumpyシンボルの複製は、Numericの時代との下位互換性のある残されたものです。 –

+0

申し訳ありません。個人的な偏見、私は推測する。 –