Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-计算两个点列表(坐标)的最小欧几里德距离_Python_List_Numpy_Distance - Fatal编程技术网

Python-计算两个点列表(坐标)的最小欧几里德距离

Python-计算两个点列表(坐标)的最小欧几里德距离,python,list,numpy,distance,Python,List,Numpy,Distance,我有两个n形列表,每个点将与第二个列表的每个点进行比较(欧氏距离),然后选择最小距离,例如: 答:[(1,1)、(2,1)、(3,1)] B:[(2,2)、(3,3)] 输出将为3个距离: 最小值((1,1)->(2,2), (1,1)->(3,3)) 最小值((2,1)->(2,2), (2,1)->(3,3)) 最小值((3,1)->(2,2), (3,1)->(3,3)) ->欧几里德距离 困难的部分是制作一个高效的代码。以下是一个示例代码,可能会有所帮助: from scipy.spat

我有两个n形列表,每个点将与第二个列表的每个点进行比较(欧氏距离),然后选择最小距离,例如:

答:[(1,1)、(2,1)、(3,1)]

B:[(2,2)、(3,3)]

输出将为3个距离:

最小值((1,1)->(2,2), (1,1)->(3,3))

最小值((2,1)->(2,2), (2,1)->(3,3))

最小值((3,1)->(2,2), (3,1)->(3,3))

->欧几里德距离


困难的部分是制作一个高效的代码。

以下是一个示例代码,可能会有所帮助:

from scipy.spatial import distance

A = [(1,1),(2,1),(3,1)]
B = [(2,2),(3,3)]

min_dist = []
for a in A:
    dist = []
    for b in B:
        dist.append(distance.euclidean(a,b))
    min_dist.append(min(dist))

>> min_dist
>> [1.4142135623730951, 1.0, 1.4142135623730951]
我正在为此使用
scipy
库。也可以使用
numpy.linalg.norm
。这种方法对你有用吗


嗯。

我找到了一种方法,我不知道是否有人能让它更有效

import numpy as np
from scipy.spatial import distance

s1 = np.array([(0,0), (0,1), (1,0), (1,1)])
s2 = np.array([(3,2), (1,9)])
print(distance.cdist(s1,s2).min(axis=1))
# array([3.60555128, 3.16227766, 2.82842712, 2.23606798]) 

这取决于你所说的“有效”是什么意思。如果你有一个相当大的列表,并且你要做很多比较,你应该只寻找最小平方距离,它的计算速度要快得多,因为你避免了平方根运算。这是处理欧几里德距离时的标准技巧

如果最终需要实际的欧几里德距离,则取平方根

考虑:

import numpy as np

A = [(1, 1), (2, 1), (3, 1)]
B = [(2, 2), (3, 3)]

# compare each point in A to all points in B, return the shortest distance

for pt in A:
    min_sq_dist = min( (pt[0] - t[0])**2 + (pt[1] - t[1])**2 for t in B )
    print(np.sqrt(min_sq_dist))
输出:

1.4142135623730951
1.0
1.4142135623730951
最大的区别是什么?上面的代码计算3个平方根。朴素的方法计算6(B)倍)