我有成千上万个点集,这些点集可馈送给Scipy的Delaunay函数,以获得对应的三角剖分集。

如果我的输入点无效,例如线上的所有点或由于其他某些原因而导致Delaunay三角剖分失败,这会在控制台中产生非常详细的报告,例如以下报告:

QH6154 qhull精度错误:初始构面1与内部点共面
错误的脸孔:
-f1
-标志:底部为单纯的上层
-正常:-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无穷大点_合并_零中心Qinterior-keep Pgood
_max-width 33错误舍入5.8e-009 _one-merge 4e-008
可见距离1.2e-008 U共面距离1.2e-008
外部宽度2.3e-008 _宽面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提供的解决方案,但似乎可以绕开它。

有什么办法可以抑制这种情况?

最佳答案

完全消除警告的一种方法是使用标准库中的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

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

10-06 05:33