2017-08-30 53 views
0

我目前使用嵌套for循環遍歷數組,以查找符合特定標準的值。問題是這種方法效率非常低,耗時。我被告知,更好的方法可能是基於數據對兩個數組進行排序,但這需要我組合幾個1D數組和一個多D數組,然後再將它們分開。有沒有更有效的方法來做到這一點?下面是我的代碼的示例:刪除嵌套for循環找到重合值

x1 = [] 
x2 = [] 
velocity = [] 
plane1Times = np.array([[2293902],[2848853],[482957]]) 
plane2Times = np.array([[7416504],[2613113],[2326542]]) 
plane1Local = np.array([[0,0,0],[0,u,0],[0,2*u,0],[u,0,0],[u,u,0],[u,2*u,0],[2*u,0,0],[2*u,u,0],[2*u,2*u,0],[3*u,0,0],[3*u,u,0],[3*u,2*u,0]],dtype='float') 
plane2Local = np.array([[0,0,D],[0,u,D],[0,2*u,D],[u,0,D],[u,u,D],[u,2*u,D],[2*u,0,D],[2*u,u,D],[2*u,2*u,D],[3*u,0,D],[3*u,u,D],[3*u,2*u,D]],dtype='float') 
for i in range(0,len(plane1Times)): 
    tic = time.time() 
    for n in range(0,len(plane2Times)): 
     if plane2Times[n] - plane1Times[i] <= 10000 and plane2Times[n] - plane1Times[i] > 0: 
      x1 = plane1Local[plane1Dets[i]] 
      x2 = plane2Local[plane2DetScale[n]] 
      distance = np.sqrt((x2[0]-x1[0])**2 + (x2[1]-x1[1])**2 + (x2[2])**2) 
      timeSeparation = (plane2Times[n]-plane1Times[i])*timeScale 
      velocity += distance/timeSeparation 
      break 

爲了給你正在服用的時間的一個例子,次每個陣列爲10個** 6值長,從而環100在i大約需要60秒。有人可以幫幫我嗎?

+0

你可以分享你的陣列的內容? – AK47

+0

每個數組都是長度爲10^6的一維數組。 – Adam

+0

變量plane1Dets和plane2DScScale是1x10^6的數組,其值範圍從0到11. – Adam

回答

1

我真的不能測試,因爲您提供的代碼是不完整的,但是這是一個可能的解決方案

for index,value in enumerate(plane1Times): 
    vec = plane2Times - value 
    row,col = np.where((vec<=10000)&(vec>0)) 
    if len(row) > 0: 
     x1 = plane1Local[plane1Dets[index]] 
     x2 = plane2Local[plane2DetScale[row[0]]] 
     distance = np.sqrt((x2[0] - x1[0]) ** 2 + (x2[1] - x1[1]) ** 2 + (x2[2]) ** 2) 
     timeSeparation = (plane2Times[row[0]] - plane1Times[index]) * timeScale 
     velocity += distance/timeSeparation 

消除二次循環,只是做減法的一次。然後搜索新的陣列,在那裏它符合您的標準。由於看起來你想要第一個值,只需要像row[0]這樣的第一個索引來獲得值檢查的索引。刪除第二個循環應該會大大減少時間。