使用python/scipy的voronoi和lloyd松弛
如何使用Qhull确定哪些voronoi单元(通过索引)是“合适的”(由“现有顶点”组成) 我试图使用LLoyds算法和scipy.spatial Voronoi(Qhull的包装器)生成的输入执行约束松弛 就代码而言,它看起来像:使用python/scipy的voronoi和lloyd松弛,python,scipy,voronoi,qhull,Python,Scipy,Voronoi,Qhull,如何使用Qhull确定哪些voronoi单元(通过索引)是“合适的”(由“现有顶点”组成) 我试图使用LLoyds算法和scipy.spatial Voronoi(Qhull的包装器)生成的输入执行约束松弛 就代码而言,它看起来像: points = [n for n in itertools.product(xrange(3),xrange(3))] vor = Voronoi(points) vor2 = lloyd(vor) # my relaxation function - no
points = [n for n in itertools.product(xrange(3),xrange(3))]
vor = Voronoi(points)
vor2 = lloyd(vor) # my relaxation function - not relevant to the question
代码生成的输出图看起来正常(见下文)
但vor结构中的数据不足以进行劳埃德松弛。
这是因为我应该只移动有效voronoi单元格内的点(图中为4)。另一个应该保持原样。Qhull扰乱了点/区域的顺序,因此我无法估计哪个区域属于哪个点
以下是问题的说明:
print vor.vertices
#[[ 0.5 0.5]
# [ 1.5 0.5]
# [ 0.5 1.5]
# [ 1.5 1.5]]
print vor.regions
# [[], [-1, 0], [-1, 1], [1, -1, 0], [3, -1, 2], [-1, 3], [-1, 2], [3, 2, 0, 1], [2, -1, 0], [3, -1, 1]]
print vor.points
# [[ 0. 0.]
# [ 0. 1.]
# [ 0. 2.]
# [ 1. 0.]
# [ 1. 1.]
# [ 1. 2.]
# [ 2. 0.]
# [ 2. 1.]
# [ 2. 2.]]
print vor.point_region
# [1 8 6 3 7 4 2 9 5]
现在我会发现,vor.regions[7]是属于vor.points[4]点的区域。
如何做到这一点
你有一个
区域
你知道,有一个点
你不知道,你知道vor.point\u region[point]==region
。对于单个区域
,您可以计算出相应的点
,如下所示:
point = np.argwhere(vor.point_region == region)
region_point = np.argsort(vor.point_region)
points = region_point[regions-1]
您还可以创建一个区域\u点
索引数组,从区域的数组中找出多个点
,如下所示:
point = np.argwhere(vor.point_region == region)
region_point = np.argsort(vor.point_region)
points = region_point[regions-1]
也许我不理解您的答案,但当我运行您建议的命令:np.argwhere(vor.point_region==4)时,结果是:array([[5]]),这是不正确的:(这是因为你应该运行np.argwhere(vor.point\u region==7)
。你知道你所在的区域(7),这就是你所追求的点(4),对吗?因为要从点获得区域,你只需执行vor.point\u region[4]
。你在哪里有完整的解决方案?有公认的答案?下面的答案对我来说足够清楚了