我有一个二维点,让我们称之为
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 nd y坐标的问题。
答案 0 :(得分:1)
通常,您使用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
返回具有最小距离的数组的 index 值(在这种情况下为0
)。
因此,如果您执行y[idx]
,它将返回最小距离的点(在这种情况下为[1, 0]
)。
答案 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)