我有一个地点和塔楼列表。我试图找出每个位置最近的塔是什么。我想出了一种有效的方法,但我很确定这是一种非常低效的方法。
我将如何以更加pythonic的方式做到这一点?
我有大约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
...
答案 0 :(得分:1)
首先,使用min
(Python doc here)找到最近的。你可以在iterable之后提供一个key
参数(这将是你的lambda函数)。
使用类而不是类似Hash的结构而不是a
对象更加pythonic。像PyPy这样的实现在处理类属性访问方面比在类似哈希的访问方面更有效。
这整个功能可以做成map
操作。您正在使用一个结构并将其映射到另一个结构,并且元素之间具有1-1对应关系,这使其成为map
。
最后(这不是Pythonic,但重要的是),你应该使用k-d tree结构来有效地找到最近的点。
答案 1 :(得分:0)
编辑:有人在这里解释了Pandas中的how to do a k-d tree search!
Here is a solution在另一个利用复杂数据类型(内置于Python和Numpy)中的问题,它比循环更快但使用大量内存。
Pandas Github proposing a get_nearest method中存在一个问题,它会像@Hbcdev那样进行k-d树搜索。 我自己想弄清楚如何在Pandas中实现kNN搜索。