在Python中找到两个列表的点之间的最小距离 [英] Find minimum distance between points of two lists in Python
问题描述
我有两个坐标列表:
s1 = [(0,0), (0,1), (1,0), (1,1)]
s2 = [(3,2), (1,9)]
我想计算s1中每个点到s2中任何点的最小距离.例如结果应该如下.
I want to calculate the minimum distance of each point in s1 to any point in s2. e.g. the results should be as follows.
result = [3.60, 3.16, 2.82, 2.23]
问题:就执行时间而言,实现这一结果的最优化方法是什么?
Question: What is the most optimized way in terms of execution time, to achieve this result?
到目前为止,我已经尝试过了,但是执行时间并不令人满意:
So far I've tried this but the execution time is not promising:
import math
def nearestDistance(boundary, p):
minDistList = map(lambda b: (b[0] - p[0])**2 + (b[1] - p[1])**2, boundary)
minDist2 = min(minDistList)
return math.sqrt(float(minDist2))
d = []
for p in s1:
d.append(nearestDistance(s2, p))
我是否应该更改s1和s2的结构(例如,代替点使用2d数组)?
Should I change the structure of s1 and s2 (instead of points use 2d arrays for example)?
推荐答案
The easiest way is probably to use scipy.spatial.distance.cdist
:
import numpy as np
from scipy.spatial import distance
s1 = np.array([(0,0), (0,1), (1,0), (1,1)])
s2 = np.array([(3,2), (1,9)])
print(distance.cdist(s1,s2).min(axis=1))
# array([3.60555128, 3.16227766, 2.82842712, 2.23606798])
直接从s1
中的任何点(也位于s2
中)直接输出0
可能会获得更高的速度.
Some more speed might be gained by directly outputting 0
for any point from s1
that is also in s2
.
这篇关于在Python中找到两个列表的点之间的最小距离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!