我有一份地点和塔楼的清单。我想找出每一个地点最近的塔是什么。我想出了一种行之有效的方法,但我确信这是一种非常低效的方法。
我怎样才能用一种更复杂的方式来做这件事呢?
我有大约4,000个地点和11,000个塔楼。我现在:
下面是代码:
nearest_tower = pd.DataFrame()
for i, location_rows in d[["Name", "Lat", "Long"]].T.iteritems():
tower_coords["Distance_km"] = tower_coords.apply(lambda row: distance_on_unit_sphere(location_rows ["Lat"], location_rows ["Long"], row['DIGITAL_LATITUDE'], row['DIGITAL_LONGITUDE'])*6373, axis=1)
a = tower_coords.sort(['Distance_km'], ascending = 1)[:1][["SITE_NUMBER", "DIGITAL_LATITUDE", "DIGITAL_LONGITUDE", "Distance_km"]]
a["Location_Name"] = location_rows ["Name"]
a["Location_Lat"] = location_rows ["Lat"]
a["Location_Long"] = location_rows ["Long"]
nearest_tower = nearest_tower.append(a)
print(i)Tower_coords看起来是这样的:
SITE_NUMBER DIGITAL_LATITUDE DIGITAL_LONGITUDE
1 67.21 -30.432
...发布于 2014-02-17 13:00:31
首先,使用min (这里的Python文档)查找最近的。您可以在迭代之后提供一个key参数(这将是您的lambda函数)。
如果使用类而不是类似哈希的结构而不是a对象,则会更像pythonic。像PyPy这样的实现处理类属性访问比使用类似哈希的访问更有效。
整个函数可以变成一个map操作。您使用一个结构并将其映射到另一个结构,元素之间的对应关系为1-1,这使得这是一个map。
最后(这不是关于Pythonic的,但它很重要),您应该使用k-d树结构来高效地找到最近的点。
https://stackoverflow.com/questions/21829065
复制相似问题