我有一个二维点,让我们称之为
p1 = (x,y)
和一系列点,
p2 = [(x1, y1), (x2, y2), (x3, y3)...]
我想构建一个数组来计算p2中每个条目与点p1之间的距离。接下来,我需要找到p2和p1中的点之间的最小距离,并返回p2中的原始坐标。到目前为止,我尝试过以下方法:
dist1 = np.sqrt(p1.x**2 + p1.y**2)
dist2 = np.sqrt(p2.x**2 + p2.y**2)
dist = dist2-dist1
返回错误“操作数无法与形状(2,)(1265,)一起广播”
至于找到最小距离,我想我需要使用numpy min函数,如下所示
import numpy as np
np.min(dist)
但是在计算距离后,我仍然坚持如何返回x和y坐标。
通常你使用scipy的cdist
来实现这一点,但是你需要以不同的格式指定数组。
例:
import numpy as np
from scipy.spatial.distance import cdist
x = np.array([[2,1]])
y = np.array([[1,0], [2,3], [4,3]])
d = cdist(x,y)
d
是具有所有距离的阵列。
通常,在指定点集时,格式p2 = [(x1, y1), (x2, y2), (x3, y3)...]
对于使用诸如numpy / scipy / pandas之类的库进行操作不是很方便。通常你可能更喜欢np.array([[x1,y1], [x2,y2], [x3,x3]])
。
要获得最小距离,请使用
idx = np.argmin(d)
idx
返回具有最小距离的数组索引的值(在本例中为0
)。
因此,如果你做y[idx]
,它将返回最小距离的点(在这种情况下为[1, 0]
)。
如果你想计算距离并找到最小的而不使用任何包装,那么你可以试试这样的东西
import sys
minimum_distance = sys.maxsize
minimum_point = (0,0)
for point in p2:
distance = math.sqrt((p[0] - point[0]) ** 2 + (p[1] - point[1]) ** 2)
if distance < minimum_distance:
minimum_distance = distance
minimum_point = point
print("Point with minimum distance", minimum_point)