3

我有两个二维坐标点数组(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函数来一一计算距离,它似乎很慢。

是否有内置功能可以做到这一点?

4

2 回答 2

10

我没有看到内置的,但你可以很容易地自己做。

distances = (a-b)**2
distances = distances.sum(axis=-1)
distances = np.sqrt(distances)
于 2013-07-30T01:04:32.810 回答
2

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
于 2013-08-25T05:00:12.430 回答