2017-03-23 6 views
0

(i、j)番目のエントリが、順序付きリストLの要素i:jの合計である行列を作成したいと思います。実際には、Pythonで行列要素をテストする最速の方法

[ 2, 5, 0, 0 ] 
[ 0, 3, 0, 0 ] 
[ 0, 0, 5, 0 ] 
[ 0, 0, 0, 7 ] 

私はその後、マトリックスをスキャンしての連続したメンバーの最大数を見つけたい:L = [2,3,5,7]、行列は次のようになります場合は合計は、例えばL.

の最大のメンバーを超えますリスト内の別の要素に追加されます。複数のサブリストがある場合は、合計が最大のものを選択します。したがって、私の前の例では、2 + 5 = 7と7がリストにあるので、最も高い数字は2になります。

非常に大きなリストでこれを行う最も簡単な方法は何ですか? (数百万の要素)。私のような何かを行うことができます:

m = np.zeros(shape = (nmb, nmb)) 
for i in range(0, nmb): 
    m[i, i:] = np.cumsum(L[i:]) 

print(m) 

を私はLで最高値を超えた場合CUMSUMを停止するかどうかはわかりません。行列の列の数を使い果たす時よりずっと前に、累積合計がLの最高値をずっと上回っているので、実際には行列の上三角形、あるいは実際にはちょうど主対角形と上三角形対角形のほうが必要です。

更新

少し速く:

m = np.zeros(shape = (nmb, nmb)) 
np.fill_diagonal(m, L) 

for i in range(0, nmb): 
    j = i + 1 
    while 2*m[i,j-1]<L[-1]: 
     m[i, j] = m[i, j-1] + m[j, j] 
     j+=1 
print(m) 

多分私が行列を使用すべきではない、まだを通じてフィルタリングし、しかし最大の筋を選ぶが遅いように思えます非常に多くのゼロ

+0

編集したコードは、あなたが望んでいた正確に何をしない、jfish003 @オリジナルのL – jfish003

+0

上でそれをテストいまいましいああ、**」...非常に大きなリストより良い条件 – dimebucker91

+0

が必要ですか? (数百万の要素)」**データストレージは従来のPC上で問題になるでしょう。最大要素は<1%、<0.1%などの要素のごくわずかな合計を保証していますか? ?https://docs.scipy.org/doc/scipy/reference/sparse.html – f5r5e5d

答えて

1

だから、私は10,000の要素になるまで行きました(それ以上の速度ではメモリの限界に近づき始めます)。そして、これはかなり速いことが分かりました(1秒未満私のマシンでND)

import numpy as np 
import time 

Cl1 = time.time() 
L = np.random.randint(1,100,10000) 
nmb = np.size(L) 
m = np.zeros(shape = (nmb, nmb)) 
np.fill_diagonal(m, L) 


for i in range(nmb-1): 
    j = i+1 
    if np.sum(L[i:j+1])<=np.max(L): 
     m[i,j] = np.sum(L[i:j+1]) 


Cl2 = time.time() 
print(m) 
print(Cl2-Cl1) 
関連する問題