【问题标题】:Improve performance of Voronoi volume estimation提高 Voronoi 体积估计的性能
【发布时间】:2020-03-19 13:53:20
【问题描述】:

我需要估计与多维空间中一组 Voronoi 单元相关的体积。从这个问题Volume of Voronoi cell (python) 我测试了this answer 并且它有效,但它真的很慢。

在下面的代码中,获取卷占用了几乎 90% 的时间:

import numpy as np
from scipy.spatial import Voronoi
from scipy.spatial import ConvexHull
import time as t

points = np.random.uniform(0., 100., (5000, 4))

s = t.time()
v = Voronoi(points)
print(t.time() - s)

s = t.time()
vol = np.zeros(v.npoints)
for i, reg_num in enumerate(v.point_region):
    indices = v.regions[reg_num]
    if -1 in indices:  # non-closed regions
        vol[i] = np.inf
    else:
        vol[i] = ConvexHull(v.vertices[indices]).volume
print(t.time() - s)

这 90% 几乎全部用于对 scipy.spatial.ConvexHull 的调用。

这可以通过任何方式改进吗?

【问题讨论】:

    标签: python performance scipy voronoi scipy-spatial


    【解决方案1】:

    scipy.spatial.ConvexHull 的调用会产生大量开销。当调用属性volume 时,对象必须首先决定它的外点,这基本上是所有通过的点周围的最小圆周(在这种情况下)。因此,在给定 n 个点的情况下,使用计算多边形表面积的函数就足够了。请参阅Area of a convex polygon 以了解此类函数的实现,假设 voronoi 单元是凸的(通常是这种情况。)

    请参阅this StackOverflow 答案以了解 Python 特定的实现。

    【讨论】:

    • 您的链接指向二维方法,我不确定在一般数量的维度上实现它有多容易(甚至可能?)。
    • 我怀疑这个问题有一个通用的解决方案,虽然我不熟悉它。你检查过scipy.spatial.ConvexHullvolume 属性的实现吗?这可能会给你一些想法。
    猜你喜欢
    • 2013-11-07
    • 2018-08-10
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多