scipy 在Numpy中,找到两个数组中每对之间的欧氏距离

x6492ojm  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(138)

我有两个2D坐标点数组(x,y)

a = [ (x1,y1), (x2,y2), ... (xN,yN) ]
b = [ (X1,Y1), (X2,Y2), ... (XN,YN) ]

如何找到1xN数组中每个对齐对(xi,yi) to (Xi,Yi)之间的欧氏距离?
scipy.spatial.cdist函数给出了NxN数组中所有对之间的距离。
如果我只是使用norm函数来逐个计算距离,似乎很慢。
有没有一个内置的函数来实现这一点?

pbossiut

pbossiut1#

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

distances = (a-b)**2
distances = distances.sum(axis=-1)
distances = np.sqrt(distances)
bvk5enib

bvk5enib2#

hypot是另一个有效的替代方案

a, b = randn(10, 2), randn(10, 2)
ahat, bhat = (a - b).T
r = hypot(ahat, bhat)

手动计算和hypot之间的timeit s结果:
说明书:

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
blmhpbnm

blmhpbnm3#

尝试将[:, np.newaxis, :]添加到第一个参数

np.linalg.norm(grid[:, np.newaxis, :] - scenario.target, axis=-1)

ref Numpy Broadcast to perform euclidean distance vectorized

相关问题