2012-05-15 104 views
0

我正在尋找從python中指定點的3D距離。現在,我正在使用for循環。但是計算速度有點慢。Numpy從指定點發現3D座標距離

這裏是Python代碼:

for i_y in xrange(0,500,100): 
     y = round(i_y/100.00,2) 

     for i_x in xrange(0, 800, 1): 
      x = round(i_x/100.00,2) 

      for i_z in xrange(500, 0, -1): 
       z = round(i_z/100.00,2) 

        for key in specifiedPoints.keys(): 
        a = specifiedPoints[key] 

         subx1 = x-a.p1.x 
         suby1 = y-a.p1.y 
         subz1 = z-a.p1.z 
         subx2 = x-a.p2.x 
         suby2 = y-a.p2.y 
         subz2 = z-a.p2.z 
         subx3 = x-a.p3.x 
         suby3 = y-a.p3.y 
         subz3 = z-a.p3.z 

         distver1 = math.sqrt(subx1*subx1+suby1*suby1+subz1*subz1) 
         distver2 = math.sqrt(subx2*subx2+suby2*suby2+subz2*subz2)   
         distver3 = math.sqrt(subx3*subx3+suby3*suby3+subz3*subz3) 

         if distver1 <= 1 or distver2<=1 or distver3<=1: 
          print "close point:", x, y, z 

我做了很多,但我無法找到一個明確的教程,顯示在numpy的平等循環。

我該如何在numpy中加速循環?

謝謝

+0

是測試點總是將是一個規則的網格?在你的例子中,'i_z','i_y','i_z'來自一個常規的for循環。如果是這樣,那麼你可以加速計算,特別是如果它重複。 – dtlussier

+0

是的,測試點總是相同的x,y,z點。指定的點可以在每個測試中更改。 – oyildirim

回答

1

你的人氣指數函數可以返回你直接計算爲X,Y和Z值,你會節省大量的計算。圓形函數根本不需要。你運行循環5 * 800 * 500 = 2.000.000次,每次除以100和round。最好這樣做:

for y in np.arange(0,5,1): 
     for x in np.arange(0,8,0.01): 
      for z in np.arange(5,0,-0.01): 

收集一個數組中的點,如下面的代碼。

point = np.array([x,y,z]) 
    a1 = np.array([a.p1.x,a.p1.y,a.p1.z]) 
    a2 = np.array([a.p2.x,a.p2.y,a.p2.z]) 
    a3 = np.array([a.p3.x,a.p3.y,a.p3.z]) 

    if np.linalg.norm(point-a1) <=1: 
     print point 
     continue 
    if np.linalg.norm(point-a2) <=1: 
     print point 
     continue 
    if np.linalg.norm(point-a3) <=1: 
     print point 
     continue 

最好是直接存儲點在你的對象specifiedPoints numpy的陣列[關鍵],而不是在每一個循環一次又一次收集它們。這將讓你驗證碼:

point = np.array([x,y,z]) 

    if np.linalg.norm(point-a.p1) <=1: 
     print point 
     continue 
    if np.linalg.norm(point-a.p2) <=1: 
     print point 
     continue 
    if np.linalg.norm(point-a.p3) <=1: 
     print point 
     continue