【问题标题】:How to disable console output on exception in scipy.spatial.qhull.Delaunay?如何在 scipy.spatial.qhull.Delaunay 中禁用控制台输出异常?
【发布时间】:2016-06-05 15:39:05
【问题描述】:

我有数千个点集,我将它们提供给 Scipy 的 Delaunay 函数以获得相应的三角测量集。

如果我的输入点无效,例如。一条线上的所有点或由于某些其他原因,Delaunay 三角剖分失败,它会在控制台中生成一个非常详细的报告,如下面的报告:

QH6154 qhull 精度错误:初始面 1 与内点共面
错误方面:
- f1
- 标志:底部单纯的 UpperDelaunay 翻转
- 正常:-0.3162 -0.9487 0
- 偏移量:5929262
- 顶点:p4(v2) p3(v1) p0(v0)
- 相邻方面:f2 f3 f4

执行时:| qhull d Qbb Qt Qc Qz
为 Qhull 2012.1 2012/02/18 选择的选项:
run-id 231396746 delaunay Qbbound-last Qtriangulate Qcoplanar-keep
Qz-infinity-point _pre-merge _zero-centrum Qinterior-keep Pgood
_max-width 33 误差舍入 5.8e-009 _one-merge 4e-008
可见距离 1.2e-008 U 共面距离 1.2e-008
外宽 2.3e-008 _wide-facet 6.9e-008

qhull 的输入似乎小于 3 维,或
计算已溢出。

Qhull 无法从点构造一个清晰的凸单纯形:
- p1(v3):4.9e+005 6.1e+006 0.00016
- p4(v2):4.9e+005 6.1e+006 33
- p3(v1):4.9e+005 6.1e+006 0
- p0(v0):4.9e+005 6.1e+006 0.0009

中心点与小平面共面,或顶点共面
与相邻的刻面。
的最大舍入误差 计算距离为 5.8e-009。中心点、刻面和距离
到中心点如下:

中心点 4.9e+005 6.087e+006 8.25

刻面 p4 p3 p0 距离= 0
刻面 p1 p3 p0 距离= 0
刻面 p1 p4 p0 距离= 0
刻面 p1 p4 p3 距离= 0

这些点要么具有最大或最小 x 坐标,要么
他们最大化 k 坐标的行列式。试用点
首先从最大化坐标的点中选择。

每个维度的最小和最大坐标是:
0: 4.9e+005 4.9e+005 差= 33
1:6.087e+006 6.087e+006 差=11
2:0 33 差异 = 33

如果输入应该是全维度的,您有几个选项
可以确定一个初始单纯形:
- 使用“QJ”来调整输入并使其成为全维度
- 使用“QbB”将点缩放到单位立方体
- 使用“QR0”随机旋转不同最大点的输入
- 使用“Qs”搜索初始单纯形的所有点
- 使用“En”指定小于 5.8e-009 的最大舍入误差。
- 使用“T3”跟踪执行以查看每个点的行列式。

如果输入是低维的:
- 使用“QJ”来调整输入并使其成为全维度
- 使用 'Qbk:0Bk:0' 从输入中删除坐标 k。你应该
选择范围最小的坐标。船体将有
正确的拓扑。
- 确定包含点的平面,旋转点
进入一个坐标平面,并删除其他坐标。
- 添加一个或多个点以使输入全维度。

根据documentation,没有立即选项可以设置Delaunay(...) 调用以禁止此报告。在相当长的qhull options 列表中我也没有找到一个选项。

我已经尝试了here 提供的解决方案,但它似乎绕过了它。

有没有办法抑制这种情况?

【问题讨论】:

    标签: python exception console scipy qhull


    【解决方案1】:

    完全抑制警告的一种方法是使用标准库中的warnings 类。

    一种实施,这是有风险的,因为您忽略了所有错误,这将抑制所有输出。您的代码如下所示:

    import warnings
    import numpy
    from scipy.spatial import Delaunay
    #random point set
    pts = numpy.random.rand(12,3)
    #warnings catch - ignore filter
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        try:
            #call Delaunay with pts input
            out = Delaunay(pts)
        except:
            #when exception arises set out to False
            out = False
    

    请记住,修改警告可能会有所帮助,以便在出现意外情况时至少打印一次特定警告。

    【讨论】:

      【解决方案2】:

      以下代码抑制了大部分打印:

      if points.shape[0]>3:
          tri = Delaunay(points, qhull_options='Pp')
      

      使用qhull_options='QJ Pp' 将进一步抑制警告,但它也会稍微修改点的原始位置以避免精度和共面性问题。

      【讨论】:

        猜你喜欢
        • 2014-08-13
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多