如何在scipy.spatial.qhull.Delaunay中禁用异常时的控制台输出?

时间:2016-02-23 17:02:30

标签: python exception console scipy qhull

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

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

  

QH6154 qhull精度误差:初始刻面1与内部点共面   ERRONEOUS FACET:
   - f1
       - flags:bottom simplicial 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-coplanar-distance 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
                                                                                   
  facet p4 p3 p0 distance = 0
  facet p1 p3 p0 distance = 0
  facet p1 p4 p0 distance = 0
  facet p1 p4 p3 distance = 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'搜索所有点的初始单纯形
     - 使用'恩'指定小于5.8e-009的最大舍入误差。
     - 使用' T3'跟踪执行看每个点的决定因素。
                                                                                   
  如果输入的尺寸较小:
     - 使用' QJ'对输入进行点动并使其成为全尺寸的      - 使用' Qbk:0Bk:0'从输入中删除坐标k。你应该       选择范围最小的坐标。船体将有       正确的拓扑。
     - 确定包含点的平面,旋转点
      进入坐标平面,并删除其他坐标。
     - 添加一个或多个点以使输入完整。

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

我已尝试过here提供的解决方案,但它似乎规避了这一点。

有没有办法压制这个?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

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

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