注意:aqueiros的answer虽然投票结果较高,但不正确。特别是这个语句" vor.regions在第一个索引中总是有一个空数组",不是真的。
我使用scipy.spatial.Voronoi函数生成简单的2D Voronoi曲面细分。我使用点的随机2D分布(参见下面的MCVE)。
我需要一种方法来遍历每个定义的区域(由scipy.spatial.Voronoi
定义)并获取与其关联的点的坐标(即:所述区域包含的点)。
问题在于为N+1
点定义了N
个区域(多边形),我不确定这意味着什么。
这是一个MCVE,当它到达最后一个区域时会失败:
from scipy.spatial import Voronoi
import numpy as np
# Generate random data.
N = 10
x = [np.random.random() for i in xrange(N)]
y = [np.random.random() for i in xrange(N)]
points = zip(x, y)
# Obtain Voronoi regions.
vor = Voronoi(points)
# Loop through each defined region/polygon
for i, reg in enumerate(vor.regions):
print 'Region:', i
print 'Indices of vertices of Voronoi region:', reg
print 'Associated point:', points[i], '\n'
我不明白的另一件事是为什么存有空vor.regions
?根据文件:
区域:形成每个Voronoi区域的Voronoi顶点的指数。 -1表示Voronoi图外的顶点。
空区域是什么意思?
添加
我尝试了point_region
属性,但显然我不明白它是如何工作的。它返回points
列表范围之外的索引。例如:在上面的MCVE中,对于10个点的列表,它总是显示索引10
,这显然超出了范围。
答案 0 :(得分:5)
关于你的第一个问题:
问题在于为N个点定义了N + 1个区域(多边形),我不确定这意味着什么。
这是因为你的vor.regions总是有一个空数组。 像
这样的东西 [[],[0, 0],[0, 1],[1, 1]]
这与你的第二个问题有关:
我不明白的另一件事是为什么存有空的vor.regions?根据文档:区域:形成每个Voronoi区域的Voronoi顶点的指数。 -1表示Voronoi图外的顶点。 空区域是什么意思?
默认情况下,Voronoi()使用QHull并启用选项'Qbb Qc Qz Qx'(qhull.org/html/qvoronoi.htm)。这会插入一个“无穷远点”,用于提高圆形输入的精度。因此,作为一个“假”点,它没有区域。如果你想摆脱这个,尝试删除Qz选项:
vor = Voronoi(points, qhull_options='Qbb Qc Qx')
答案 1 :(得分:3)
我误读了文档。它说:
point_region:每个输入点的 Voronoi区域的索引 。
我正在使用point_region
,就好像它是每个 Voronoi区域的输入点的<&34; 索引 < / EM>&#34;
而不是使用:
points[i]
每个区域的正确点坐标可以通过以下方式获得:
np.where(vor.point_region == i)[0][0]