2011-07-11 3 views
2

私は、ブルートフォースを使ってオイラーレンガを探すためのプログラムを書いてきましたが、私が考えた方法は3重ループです。入れ子にされたPythonループは非常に遅くなるので、必要な値の配列を作成するためにnumpyを使用するより良い方法があるのだろうかと思っていました。numpyで入れ子になっているループを取り除く

#x=max side length of brick. User Input.  
for t in range(3,x): 
    a=[];b=[];c=[]; 
    for u in range(2,t): 
     for v in range(1,u): 
       a.append(t) 
       b.append(u) 
       c.append(v) 
    a=np.array(a) 
    b=np.array(b) 
    c=np.array(c) 
    ... 

numpyコマンドを使用して配列af値を生成するより良い方法はありますか?

ありがとうございました。

例: tは私が取得したい3 = X = 10、もし:

a=[3] 
b=[2]  
c=[1] 

初めてループを通って。その後、T 4 =とき:

a=[4, 4, 4] 
b=[2, 3, 3] 
c=[1, 1, 2] 

第三の時間(t = 5)欲しい:

a=[5, 5, 5, 5, 5, 5] 
b=[2, 3, 3, 4, 4, 4] 
c=[1, 1, 2, 1, 2, 3] 

など、最大辺の長さまでの周り5000程度です。

EDIT:ソリューション

a=array(3) 
b=array(2) 
c=array(1) 
for i in range(4,x): #Removing the (3,2,1) check from code does not affect results. 
    foo=arange(1,i-1) 
    foo2=empty(len(foo)) 
    foo2.fill(i-1) 
    c=hstack((c,foo)) 
    b=hstack((b,foo2)) 
    a=empty(len(b)) 
    a.fill(i) 
    ... 

が速くなりました何度も動作します。皆さんありがとう。

+0

あなたは、入力値と所望の出力の例を投稿してもらえますか?正しい表現を見つけるのに役立ちます。 –

+0

3レベルのネストされたループは、Pythonだけでなく、遅いです。 –

答えて

1

いる可能性のものがいくつかあります助けになるかもしれませんが、多分xの大きな値に対してのみです。初心者の方は、rangeの代わりにxrangeを使用してください。これは必要のないリストの作成を節約します。また、リストに追加してnumpyの配列に変換するのではなく、正しい長さの空の配列を作成し、値を入力することもできます。私はこのコードは(右のこの第二の一切のpythonアクセス)が動作していないと考えている

for t in xrange(3, x): 
    size = (t - 2) * (t - 3) 
    a = np.zeros(size) 
    b = np.zeros(size) 
    c = np.zeros(size) 

    idx = 0 
    for u in xrange(2,t): 
     for v in xrange(1,u): 
      a[idx] = t 
      b[idx] = u 
      c[idx] = v 
      idx += 1 
+0

配列から始めることを考えましたが、numpyで.append()を実行することはできません。同等のものはありますか? –

+0

また、各ループを上書きしてゼロから始めるのではなく、毎回bとcの配列に追加することができます。 –

+0

試してみてください。http://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html – troutinator

2

.emptyと.fill(http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.fill.html)を使用してみてください

+0

これはaの値では機能しますが、bとcの値では機能しません。 –

関連する問題