Python 计算到多个点的最小距离图
给定一组点Python 计算到多个点的最小距离图,python,algorithm,math,numpy,computational-geometry,Python,Algorithm,Math,Numpy,Computational Geometry,给定一组点障碍物(作为行、列矩阵坐标列表,一组形状(n,2))返回一个大小大小的地图(其中大小是2D NumPy数组的形状),其中r,c的值是到最近“障碍物”的欧氏距离 我的方法非常慢,我觉得应该有一个更好的方法。是一个类似问题的解决方案,使用带有Numpy和SciPy的KD树。只需将您的障碍物插入KD树,并查询每个网格点的树,以获得其最近的邻居。是使用带有Numpy和SciPy的KD树的类似问题的解决方案。只需将您的障碍物插入KD树并查询每个网格点的树,以获得其最近的邻居。我最终使用了来自Sc
障碍物(作为行、列矩阵坐标列表,一组形状(n,2)
)返回一个大小大小的地图(其中大小是2D NumPy数组的形状),其中r,c
的值是到最近“障碍物”的欧氏距离
我的方法非常慢,我觉得应该有一个更好的方法。是一个类似问题的解决方案,使用带有Numpy和SciPy的KD树。只需将您的障碍物插入KD树,并查询每个网格点的树,以获得其最近的邻居。是使用带有Numpy和SciPy的KD树的类似问题的解决方案。只需将您的障碍物插入KD树并查询每个网格点的树,以获得其最近的邻居。我最终使用了来自SciPy的。它有一个非常简单的距离函数
from scipy.spatial import cKDTree as KDTree
def gen_distgrid(obstacles):
n_obstacles = obstacles.shape[0]
obstacles = np.vstack((obstacles, [0,0], [0, size[1] - 1], [size[0] - 1, 0], [size[0] - 1, size[1] - 1]))
distgrid = np.zeros((size[0], size[1]))
obs_tree = KDTree(data=obstacles)
i_v = np.arange(size[0])
j_v = np.arange(size[1])
coordmat = np.dstack(np.meshgrid(i_v, j_v, indexing='ij'))
obs_dists, obs_locs = obs_tree.query(coordmat)
top_dists = np.repeat(i_v, size[1]).reshape(size)
bottom_dists = np.repeat(size[0] - i_v, size[1]).reshape(size)
left_dists = np.repeat(j_v, size[0]).reshape(np.transpose(size)).T
right_dists = np.repeat(size[1] - j_v, size[0]).reshape(np.transpose(size)).T
dists = np.min([obs_dists, top_dists, bottom_dists, left_dists, right_dists], axis=0)
return dists
最后我用的是SciPy的。它有一个非常简单的距离函数
from scipy.spatial import cKDTree as KDTree
def gen_distgrid(obstacles):
n_obstacles = obstacles.shape[0]
obstacles = np.vstack((obstacles, [0,0], [0, size[1] - 1], [size[0] - 1, 0], [size[0] - 1, size[1] - 1]))
distgrid = np.zeros((size[0], size[1]))
obs_tree = KDTree(data=obstacles)
i_v = np.arange(size[0])
j_v = np.arange(size[1])
coordmat = np.dstack(np.meshgrid(i_v, j_v, indexing='ij'))
obs_dists, obs_locs = obs_tree.query(coordmat)
top_dists = np.repeat(i_v, size[1]).reshape(size)
bottom_dists = np.repeat(size[0] - i_v, size[1]).reshape(size)
left_dists = np.repeat(j_v, size[0]).reshape(np.transpose(size)).T
right_dists = np.repeat(size[1] - j_v, size[0]).reshape(np.transpose(size)).T
dists = np.min([obs_dists, top_dists, bottom_dists, left_dists, right_dists], axis=0)
return dists
对不起,什么是r
和c
?@mgilson:行和列,或者你可以说i,j
。那么,对于每个障碍,你想知道哪个障碍是最近的吗?@mgilson:不,对于网格中的每个点。对不起,仍然没有得到它--网格是什么?我在问题中没有看到太多提到它,但有一些代码似乎可以生成网格并对其进行处理……对不起,什么是r
和c
?@mgilson:row和column,或者你可以说I,j
。那么,对于每个障碍,你想知道哪个障碍是最近的吗?@mgilson:no,对于网格中的每一点。抱歉,仍然没有得到它-网格是什么?我在问题中没有看到太多提到它,但是有一些代码似乎生成了一个网格并用它做了一些事情……这不是理论上最好的,但它的速度惊人。这不是理论上最好的,但它的速度惊人。