gpt4 book ai didi

python - 来自 SciPy 的带有 QHull 的凸包体积

转载 作者:太空狗 更新时间:2023-10-29 17:39:40 25 4
gpt4 key购买 nike

我正在尝试使用 SciPy wrapper for QHull 获取一组点的凸包体积 .

根据documentation of QHull , 我应该传递 "FA" 选项以获得总表面积和体积。

这是我得到的..我做错了什么?

> pts
[(494.0, 95.0, 0.0), (494.0, 95.0, 1.0) ... (494.0, 100.0, 4.0), (494.0, 100.0, 5.0)]


> hull = spatial.ConvexHull(pts, qhull_options="FA")

> dir(hull)

['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_qhull', '_update', 'add_points', 'close', 'coplanar', 'equations', 'max_bound', 'min_bound', 'ndim', 'neighbors', 'npoints', 'nsimplex', 'points', 'simplices']

> dir(hull._qhull)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

最佳答案

似乎没有任何明显的方法可以直接获得您想要的结果,无论您传入什么参数。如果不是 ConvexHull,您自己计算应该不会太难>,您使用 Delaunay (其中还提供了大部分与凸包相关的信息)。

def tetrahedron_volume(a, b, c, d):
return np.abs(np.einsum('ij,ij->i', a-d, np.cross(b-d, c-d))) / 6

from scipy.spatial import Delaunay

pts = np.random.rand(10, 3)
dt = Delaunay(pts)
tets = dt.points[dt.simplices]
vol = np.sum(tetrahedron_volume(tets[:, 0], tets[:, 1],
tets[:, 2], tets[:, 3]))

编辑 根据评论,以下是获取凸包体积的更快方法:

def convex_hull_volume(pts):
ch = ConvexHull(pts)
dt = Delaunay(pts[ch.vertices])
tets = dt.points[dt.simplices]
return np.sum(tetrahedron_volume(tets[:, 0], tets[:, 1],
tets[:, 2], tets[:, 3]))

def convex_hull_volume_bis(pts):
ch = ConvexHull(pts)

simplices = np.column_stack((np.repeat(ch.vertices[0], ch.nsimplex),
ch.simplices))
tets = ch.points[simplices]
return np.sum(tetrahedron_volume(tets[:, 0], tets[:, 1],
tets[:, 2], tets[:, 3]))

对于一些虚构的数据,第二种方法似乎快了大约 2 倍,而且数值精度似乎非常好(小数点后 15 位!!!),尽管必须有一些更病态的情况:

pts = np.random.rand(1000, 3)

In [26]: convex_hull_volume(pts)
Out[26]: 0.93522518081853867

In [27]: convex_hull_volume_bis(pts)
Out[27]: 0.93522518081853845

In [28]: %timeit convex_hull_volume(pts)
1000 loops, best of 3: 2.08 ms per loop

In [29]: %timeit convex_hull_volume_bis(pts)
1000 loops, best of 3: 1.08 ms per loop

关于python - 来自 SciPy 的带有 QHull 的凸包体积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24733185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com