2011-07-11 54 views
2

我一直在編寫一個程序來蠻力檢查一系列數字來尋找歐拉磚,但我想出的方法涉及三重循環。由於嵌套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值?

謝謝。

示例: 如果x = 10,當t = 3我想獲得:

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左右。

編輯:解

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值。首先使用xrange而不是range,這將節省創建一個你永遠不需要的列表。您也可以創建正確長度的空numpy數組,並將它們填入值中,而不是追加到列表中,然後將其轉換爲numpy數組。

我相信這個代碼將工作(不蟒蛇訪問權限第二個):

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值。 –