voronoi和lloyd使用python / scipy放松

时间:2013-07-14 06:52:46

标签: 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  - not relevant to the question

代码生成的输出图表看起来不错(见下文) 但是vor结构中的数据不足以执行Lloyds放松。 这是因为我只应移动有效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]的区域。 怎么做到这一点?

Voronoi on 3x3 grid

1 个答案:

答案 0 :(得分:4)

您知道regionpoint您不知道,而且您知道vor.point_region[point] == region。对于单个region,您可以找出相应的point

point = np.argwhere(vor.point_region == region)

您还可以创建region_point索引数组,以便从points数组中找出多个regions

region_point = np.argsort(vor.point_region)
points = region_point[regions-1]