![](/img/trans.png)
[英]Fastest way to calculate the shortest (euclidean) distance between points, in pandas dataframe
[英]The fastest way of checking the closest distance between points
我有2本字典。 兩者都具有索引和世界空間位置的鍵值對。
就像是:
{
"vertices" :
{
1: "(0.004700, 130.417480, -13.546420)",
2: "(0.1, 152.4, 13.521)",
3: "(58.21, 998.412, -78.0051)"
}
}
詞典1將始終具有大約20至100個條目,詞典2將始終具有大約10,000個條目。
對於字典1中的每個點,我想找到字典2中最接近它的點。 最快的方法是什么? 對於字典1中的每個條目,循環瀏覽字典2中的所有條目 ,然后返回最接近的條目 。
一些未經測試的偽代碼:
for point, distance in dict_1.iteritems():
closest_point = get_closest_point(dict_1.get(point))
def get_closest_point(self, start_point)
furthest_distance = 2000000
closest_point = 0
for index, end_point in dict_1.iteritems():
distance = get_distance(self, start_point, end_point)
if distance < furthest_distance:
furthest_distance = distance
closest_point = closest_point
return closest_point
我認為這樣會起作用。 “問題”是,如果我在字典1中有100個條目,它將是100 x 10,000 = 1,000,000次迭代。 在我看來,這似乎並不很快或優雅。
在Maya / Python中是否有更好的方法?
編輯:只是想評論一下,我以前使用過closestPointOnMesh節點,它工作得很好,並且如果您要檢查的點實際上是網格的一部分,則容易得多。 您可以執行以下操作:
selected_object = pm.PyNode(pm.selected()[0])
cpom = pm.createNode("closestPointOnMesh", name="cpom")
for vertex, distance in dict_1.iteritems():
selected_object.worldMesh >> cpom.inMesh
cpom.inPosition.set(dict_1.get(vertex))
print "closest vertex is %s " % cpom.closestVertexIndex.get()
來自該節點的即時答復,一切都很輕松。 但是,如果要檢查的點列表不是網格的一部分,則不能使用它。 實際上是否可能/願意:
您肯定需要非平凡數量點的加速結構。 您想要的是KD樹或八叉樹-KD樹在搜索中性能更高,但構建速度較慢,並且可能更難編碼。 同樣,由於八進制是空間的而不是二進制的,因此它們可能會使進行瑣碎的測試變得更加容易。
您可以在此處獲取python八叉樹: http : //code.activestate.com/recipes/498121-python-octree-implementation/
如果您要進行大量距離檢查,則肯定要使用Maya API向量類進行實際的數學比較-盡管這將比同等的python快很多,但要快得多。 如果您不太了解API,則可以從pymel.datatypes
獲取這些信息,盡管使用更新的API2版本非常容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.