我有两个二维坐标点数组(x,y)
a = [ (x1,y1), (x2,y2), ... (xN,yN) ]
b = [ (X1,Y1), (X2,Y2), ... (XN,YN) ]
如何找到数组中每个对齐对之间的欧几里得(xi,yi) to (Xi,Yi)
距离1xN
?
该函数为我提供了数组scipy.spatial.cdist
中所有对之间的距离。NxN
如果我只是使用norm
函数来一一计算距离,它似乎很慢。
是否有内置功能可以做到这一点?
我有两个二维坐标点数组(x,y)
a = [ (x1,y1), (x2,y2), ... (xN,yN) ]
b = [ (X1,Y1), (X2,Y2), ... (XN,YN) ]
如何找到数组中每个对齐对之间的欧几里得(xi,yi) to (Xi,Yi)
距离1xN
?
该函数为我提供了数组scipy.spatial.cdist
中所有对之间的距离。NxN
如果我只是使用norm
函数来一一计算距离,它似乎很慢。
是否有内置功能可以做到这一点?
我没有看到内置的,但你可以很容易地自己做。
distances = (a-b)**2
distances = distances.sum(axis=-1)
distances = np.sqrt(distances)
hypot
是另一个有效的选择
a, b = randn(10, 2), randn(10, 2)
ahat, bhat = (a - b).T
r = hypot(ahat, bhat)
timeit
手动计算与 之间的 s 的结果hypot
:
手动的:
timeit sqrt(((a - b) ** 2).sum(-1))
100000 loops, best of 3: 10.3 µs per loop
使用hypot
:
timeit hypot(ahat, bhat)
1000000 loops, best of 3: 1.3 µs per loop
现在一些成人大小的数组怎么样:
a, b = randn(1e7, 2), randn(1e7, 2)
ahat, bhat = (a - b).T
timeit -r10 -n3 hypot(ahat, bhat)
3 loops, best of 10: 208 ms per loop
timeit -r10 -n3 sqrt(((a - b) ** 2).sum(-1))
3 loops, best of 10: 224 ms per loop
两种方法之间的性能差异不大。您可以通过避免从后者中挤出一点点pow
:
d = a - b
timeit -r10 -n3 sqrt((d * d).sum(-1))
3 loops, best of 10: 184 ms per loop