Python scipy voronoi 3d-未显示所有脊点

Python scipy voronoi 3d-未显示所有脊点,python,numpy,scipy,voronoi,Python,Numpy,Scipy,Voronoi,我在使用scipy的Voronoi函数时遇到了问题。我遵循了2d示例,但是当我在3d中执行类似示例时,并没有计算所有脊点。我的数据是[0,2]x[0,2]x[0,2]中包含27个点的方框: points = np.array([ # bottom plane [0,2,0], [1,2,0], [2,2,0], [0,1,0], [1,1,0], [2,1,0], [0,0,0], [1,0,0], [2,0,0], # middle plane

我在使用scipy的Voronoi函数时遇到了问题。我遵循了2d示例,但是当我在3d中执行类似示例时,并没有计算所有脊点。我的数据是[0,2]x[0,2]x[0,2]中包含27个点的方框:

points = np.array([
    # bottom plane
    [0,2,0], [1,2,0], [2,2,0],
    [0,1,0], [1,1,0], [2,1,0],
    [0,0,0], [1,0,0], [2,0,0],
    # middle plane
    [0,2,1], [1,2,1], [2,2,1],
    [0,1,1], [1,1,1], [2,1,1],
    [0,0,1], [1,0,1], [2,0,1],
    # top plane
    [0,2,2], [1,2,2], [2,2,2],
    [0,1,2], [1,1,2], [2,1,2],
    [0,0,2], [1,0,2], [2,0,2]
    ])

vor = Voronoi(points)

print vor.ridge_points
# outputed
array([[ 4,  7],
       [ 4,  5],
       [ 4,  3],
       [ 4,  1],
       [ 4, 13],
       [ 3, 12],
       [ 7, 16],
       [15, 12],
       [15, 16],
       [ 9, 12],
       [ 9, 10],
       [ 1, 10],
       [12, 21],
       [12, 13],
       [23, 14],
       [23, 22], 
       [14, 17],
       [14, 11],
       [14,  5],
       [14, 13],
       [22, 19],
       [22, 21],
       [22, 13],
       [22, 25],
       [17, 16],
       [11, 10],
       [25, 16],
       [16, 13],
       [13, 10],
       [19, 10], dtype=int32)
我注意到拐角处有几点:

points[0] = array([0, 2, 0])
points[2] = array([2, 2, 0])
points[6] = array([0, 0, 0])
points[8] = array([2, 0, 0])
points[18] = array([0, 2, 2])
points[20] = array([2, 2, 2])
points[24] = array([0, 0, 2])
points[26] = array([2, 0, 2])
没有任何脊点。我会假设(像2d的情况)角点会有脊点。例如,我假设点[6]=[0,0,0]具有带[1,0,0]、[0,1,0]和[0,0,1]的脊点。这是不是不可能用scipy计算,或者我一直在想这个错误

Scipy用于Delaunay/Voronoi/Convexhull计算。
ridge_points
中包含的数据是由
qvoronoi Fv
报告的数据,尽管ridge不一定按相同的顺序列出。(作为支票:)

Fv
()的Qhull文档中提到了一个与此相关的警告:

选项“Fv”未列出需要多个中点的脊线。例如,共球面点的Voronoi图列出了零脊(例如,“rbox 10 s | qvoronoi Fv Qz”)。其他示例为矩形网格的Voronoi图(例如,“rbox 27 M1,0 | qvoronoi Fv”)或具有矩形角的点集(例如,“rbox P4,4,4 P4,2,4 P2,4,4 P4,4,2 10 | qvoronoi Fv”)。这两种情况都忽略了拐角处的无界光线。要确定这些脊线,请使用大立方体(例如,“rbox 10 s c G2.0 | qvoronoi Fv Qz”)围绕这些点。立方体需要足够大,以绑定原始点集的所有Voronoi区域。请报告遗漏的任何其他病例。如果您可以正式描述这些案例或编写代码来处理它们,请发送电子邮件至qhull@qhull.org.

文本中提到的
rbox 27 M1,0
与示例中的点集完全相同(顺序不同)


通常,Qhull在处理几何简并方面存在问题,例如在矩形网格中。一种通用的解决方法是设置
qhull_options=“QJ”
,它告诉它向数据点添加随机扰动,直到退化得到解决。这通常会生成带有多个附加单纯形/脊线的tesselations/voronoi图,但可能会解决此类问题。

我也有同样的问题。然后我用Delaunay得到了3D中的所有rigde点。详情如下:

def find_neighbors(tess):
"""
Parameters
----------
tess : Delaunay

Returns
-------
neighbors : neighbors in defaultdict type

"""

neighbors = defaultdict(set)

for simplex in tess.simplices:
    for idx in simplex:
        other = set(simplex)
        other.remove(idx)
        neighbors[idx] = neighbors[idx].union(other)
return neighbors

import scipy.spatial
from collections import defaultdict

x_list = np.random.random(8)
y_list = np.random.random(8)
z_list = np.random.random(8)

tri = scipy.spatial.Delaunay(np.array([[x,y,z] for x,y,z in zip(x_list, y_list, z_list)])) # create the Delaunay triangles
print(find_neighbors(tri))

FWIW,Scipy输出同意——然而,我不完全理解为什么Qhull报告的沃罗诺脊是这样的。