2010-09-15 84 views
4

我有兩個詞典列表。第一個列表包含範圍爲x,y,z,半徑爲的球體定義。第二個列表包含空間中的各個點,如x,y,z。這些列表都很長,因此遍歷每個列表並與所有值進行比較效率不高。有沒有辦法比較python中的兩個字典列表有效嗎?

我一直在嘗試地圖和減少術語,但他們都只在過濾功能中只有一個術語。什麼我使用的是以下幾點:

 for curNode in nodeList: 
      for i in sphereList: 
        tmpRad = findRadius(i, curNode) 
        if float(tmpRad) <= float(i['radius']): 
          print "Remove node", curNode['num'] 
          nodeRemovalList.append(curNode['num']) 
          break 

其中i是當前領域(x, y, z, rad)curNode是節點(num, x, y, z)。對於大型列表,這變得非常低效。我想過濾掉任何球體半徑內的節點。

回答

3

您可能希望查看諸如spatial octrees之類的內容,以減少檢查每個點所需的球體數量。

4

試試這個:

def in_sphere(node): 
    return any(float(findRadius(sphere, node)) <= float(sphere['radius']) 
       for sphere in sphereList) 

nodeRemovalList = filter(in_sphere, nodeList) 

這將跑得比你已經顯示的代碼更快。

這是假設你實際上想要nodeRemovalList,它不只是一箇中間步驟。如果這只是一箇中間步驟,請返回not any(,過濾器的結果將成爲您想要的集合。

另外,爲什麼不是sphere['radius']已經浮動?這將在一個非常大的列表中加速一點。

+0

typecast在那裏,因爲我沒有在初始讀取上進行類型轉換。我從一個txt文件獲取數據,因此它被解析爲字符串。我現在已經進行了修正。感謝關於代碼的建議。 – Shuo 2010-09-15 06:45:45

2

您是否試圖檢測哪些點落在一個球體內。在numpy中使用基於矩陣的方法可能會更容易,因爲您可以高效地爲所有點執行一個3d距離向量,讓p = point(x1,y1,z1)。讓A爲球體中心的數組,然後距離矢量數組可以是計算機,並與numpy中的半徑數組進行比較。你會發現矩陣運算比迭代更快。

+0

我正在嘗試檢測落入球體內的點。我沒有考慮使用矩陣計算。構建球體矩陣並與節點矩陣進行比較可能更有用和更高效。謝謝你。 – Shuo 2010-09-15 06:43:15

相關問題