【发布时间】:2017-11-24 16:42:11
【问题描述】:
我有一个 数据框,其中有 >2.7MM 坐标,还有一个单独的 列表,包含 ~2,000 个坐标。我试图返回 每个单独的行 中的坐标与 列表中的每个坐标 相比的最小距离。以下代码适用于小规模(具有 200 行的数据帧),但当计算超过 2.7MM 行时,它似乎永远运行。
from haversine import haversine
df
Latitude Longitude
39.989 -89.980
39.923 -89.901
39.990 -89.987
39.884 -89.943
39.030 -89.931
end_coords_list = [(41.342,-90.423),(40.349,-91.394),(38.928,-89.323)]
for row in df.itertuples():
def min_distance(row):
beg_coord = (row.Latitude, row.Longitude)
return min(haversine(beg_coord, end_coord) for end_coord in end_coords_list)
df['Min_Distance'] = df.apply(min_distance, axis=1)
我知道问题在于正在发生的大量计算(5.7MM * 2,000 = ~11.4BN),而且运行这么多循环的效率非常低。
根据我的研究,向量化的 NumPy 函数似乎是一种更好的方法,但我是 Python 和 NumPy 的新手,所以我不太确定如何在这种特殊情况下实现它。
理想输出:
df
Latitude Longitude Min_Distance
39.989 -89.980 3.7
39.923 -89.901 4.1
39.990 -89.987 4.2
39.884 -89.943 5.9
39.030 -89.931 3.1
提前致谢!
【问题讨论】:
-
告诉我们这个
harversine。它接受哪些输入?真正的vectorization通常需要减少numpy在编译代码中处理的基本数学计算。我们不能vectorize黑盒子。 -
haversine接受两个输入:“开始”坐标和“结束”坐标,并计算两者之间的距离(以公里为单位)。 -
是来自
here吗?如果是这样,请在问题中链接。 -
刚刚更新。让我知道这是否提供了您想要的清晰度。
-
我们需要该软件包的源代码信息。再次发布以确认这是否是链接 - github.com/mapado/haversine/blob/master/haversine/__init__.py?不要假设我们已经安装了所有的包。
标签: python pandas numpy vectorization haversine