我有两个数组,其中包含不同大小的点坐标 shapely.geometry.Point 。
Eg:
[Point(X Y), Point(X Y)...]
[Point(X Y), Point(X Y)...]
我想用距离函数创建这两个数组的“叉积”。距离函数来自shapely.geometry,它是一个简单的几何向量距离计算。我正在尝试创建 M:N 点之间的距离矩阵:
现在我有这个功能:
source = gpd.read_file(source)
near = gpd.read_file(near)
source_list = source.geometry.values.tolist()
near_list = near.geometry.values.tolist()
array = np.empty((len(source.ID_SOURCE), len(near.ID_NEAR)))
for index_source, item_source in enumerate(source_list):
for index_near, item_near in enumerate(near_list):
array[index_source, index_near] = item_source.distance(item_near)
df_matrix = pd.DataFrame(array, index=source.ID_SOURCE, columns = near.ID_NEAR)
这可以很好地完成工作,但速度很慢。 4000 x 4000 点大约需要 100 秒(我的数据集更大,所以速度是主要问题)。如果可能的话,我想避免这种双重循环。我尝试在 pandas 数据框中执行如下操作(速度很慢):
for index_source, item_source in source.iterrows():
for index_near, item_near in near.iterrows():
df_matrix.at[index_source, index_near] = item_source.geometry.distance(item_near.geometry)
更快一点的是(但仍然比 numpy 慢 4 倍):
for index_source, item_source in enumerate(source_list):
for index_near, item_near in enumerate(near_list):
df_matrix.at[index_source, index_near] = item_source.distance(item_near)
有没有更快的方法来做到这一点?我想有,但我不知道如何继续。我也许能够将数据帧分成更小的块,并将块发送到不同的核心并连接结果 - 这是最后的手段。如果以某种方式我们可以仅使用 numpy 和一些仅索引魔法,我可以将它发送到 GPU 并立即完成它。但现在双重 for 循环是不行的。另外我不想使用除 Pandas/Numpy 之外的任何其他库。我可以使用 SAGA 处理及其点距离模块(http://www.saga-gis.org/saga_tool_doc/2.2.2/shapes_points_3.html http://www.saga-gis.org/saga_tool_doc/2.2.2/shapes_points_3.html),这非常快,但我正在寻找仅 Python 的解决方案。