在Python中找到两个列表的点之间的最小距离 [英] Find minimum distance between points of two lists in Python

查看:1566
本文介绍了在Python中找到两个列表的点之间的最小距离的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个坐标列表:

s1 = [(0,0), (0,1), (1,0), (1,1)]
s2 = [(3,2), (1,9)]

我想计算s1中每个点到s2中任何点的最小距离.例如结果应该如下.

I want to calculate the minimum distance of each point in s1 to any point in s2. e.g. the results should be as follows.

result = [3.60, 3.16, 2.82, 2.23]

问题:就执行时间而言,实现这一结果的最优化方法是什么?

Question: What is the most optimized way in terms of execution time, to achieve this result?

到目前为止,我已经尝试过了,但是执行时间并不令人满意:

So far I've tried this but the execution time is not promising:

import math
def nearestDistance(boundary, p):
    minDistList = map(lambda b: (b[0] - p[0])**2 + (b[1] - p[1])**2, boundary)
    minDist2 = min(minDistList)
    return math.sqrt(float(minDist2))

d = []
for p in s1:
    d.append(nearestDistance(s2, p))

我是否应该更改s1和s2的结构(例如,代替点使用2d数组)?

Should I change the structure of s1 and s2 (instead of points use 2d arrays for example)?

推荐答案

最简单的方法可能是使用

The easiest way is probably to use scipy.spatial.distance.cdist:

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])

直接从s1中的任何点(也位于s2中)直接输出0可能会获得更高的速度.

Some more speed might be gained by directly outputting 0 for any point from s1 that is also in s2.

这篇关于在Python中找到两个列表的点之间的最小距离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆