Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm_Math_Numpy_Computational Geometry - Fatal编程技术网

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,对于网格中的每一点。抱歉,仍然没有得到它-网格是什么?我在问题中没有看到太多提到它,但是有一些代码似乎生成了一个网格并用它做了一些事情……这不是理论上最好的,但它的速度惊人。这不是理论上最好的,但它的速度惊人。