获得与Voronoi地区相关的点(scipy.spatial.Voronoi)

Gab*_*iel 4 python voronoi scipy

注意:aqueiros 的回答,虽然投票结果更高,但是不正确.特别是这句话" 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'
Run Code Online (Sandbox Code Playgroud)

我不明白的另一件事是为什么有空vor.regions存储?根据文件:

region:形成每个Voronoi区域的Voronoi顶点的索引.-1表示Voronoi图外的顶点.

空区域是什么意思?


加

我试过了这个point_region属性,但显然我不明白它是如何工作的.它返回points列表范围之外的索引.例如:在上面的MCVE中,它将始终显示1010个点的列表的索引,这显然超出范围.

Gab*_*iel 8

我误读了文档。它说:

point_region:每个输入点的Voronoi 区域的索引。

我使用point_region它就好像它是:“每个Voronoi 区域的输入点索引”。

而不是使用:

points[i]
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式获得每个区域的正确点坐标:

np.where(vor.point_region == i)[0][0]
Run Code Online (Sandbox Code Playgroud)


aqu*_*ros 7

对于你的第一个问题:

问题在于为N个点定义了N + 1个区域(多边形),我不确定这意味着什么.

这是因为你的vor.regions总是有一个空数组.就像是

    [[],[0, 0],[0, 1],[1, 1]]
Run Code Online (Sandbox Code Playgroud)

这与你的第二个问题有关:

我不明白的另一件事是为什么存有空的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')
Run Code Online (Sandbox Code Playgroud)