计算numpy数组之间的距离

2024-05-08 16:30:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数组,第一个np.数组是从,和第二点np.数组是我需要计算的所有距离。在

示例:

 import numpy as np
 from_array = np.array([(0,1), (1,1), ..., (x,y)])
 to_array = np.array([(5,1), (3,1), ..., (x,y)])

我需要做的是获取from_array的第一个条目,并计算from_array[0]到to_数组中所有点之间的所有距离,然后保持最大距离。在

所以我可以这么做:

^{pr2}$

但这是缓慢的,我正在寻找一个优化的方式来做计算,因为我可以有数千点。在

最终目标是计算Hausdorff距离。在

fhd = np.mean(np.min(SomeDistanceArray,axis=0))
rhd = np.mean(np.min(SomeDistanceArray,axis=1))
print (max(fhd, rhd))

我只想在这个任务中使用numpy。 我的距离可以是欧几里得距离,也可以是平方欧几里得距离。在

所以我需要的是一个优化的方法来计算欧几里德距离法np.数组. 应该注意,数组1可能比数组2有更多的行。意味着2D数组(x,y)的长度可以比较10行和30行。在


Tags: tofromimportnumpy距离示例np数组
2条回答

仅限Numpy。所以没有scipy.spatial.distance.cdist

首先,不要使用元组,使用2xN和2xM数组。然后广播。在

np.linalg.norm(from_array[:,:,None]-to_array[:,None,:], axis=0)

如果你有一个古代版本的numpy没有向量化的linalg.norm(即,你使用的是Abaqus),请这样做:

^{pr2}$

这是一个基于NumPy的方法,使用^{}-

subs = from_array[:,None] - to_array
sq_eucliean_dist = np.einsum('ijk,ijk->ij',subs,subs)
eucliean_dist = np.sqrt(sq_eucliean_dist)

注意:如果您以后要计算np.mean(np.min(SomeDistanceArray,axis=0)),您可以跳过eucliean_dist的计算,直接使用sq_eucliean_dist作为{},因为计算平方根会非常昂贵。在


什么是np.einsum('ijk,ijk->ij',subs,subs)做的?它在同一个数组subs之间执行元素乘法,即基本上是平方,然后沿着最后一个轴进行求和运算,因此在该约简过程中丢失了它。在

那么,为什么不显式地进行平方和求和呢?好吧,np.einsum的好处是它在一个步骤中同时进行平方和求和,给了我们显著的性能效率。在

因此,最后,如果from_array(N x 2)数组,to_array是{}数组,np.einsum的输出将是作为形状^{的2D数组的欧几里德距离的平方。 关于字符串表示法本身的更多信息需要更长时间的讨论,其中一些可以在^{}和之前发布的官方文档链接中找到。在

相关问题 更多 >