scipy.spatial.

ConvexHull#

класс scipy.spatial.ConvexHull(точки, инкрементальных=False, qhull_options=None)#

Выпуклые оболочки в N измерениях.

Добавлено в версии 0.12.0.

Параметры:
точкиndarray из float, форма (npoints, ndim)

Координаты точек для построения выпуклой оболочки

инкрементальныхbool, необязательно

Разрешить добавление новых точек инкрементально. Это требует некоторых дополнительных ресурсов.

qhull_optionsstr, optional

Дополнительные опции для передачи в Qhull. См. руководство Qhull для подробностей. (По умолчанию: "Qx" для ndim > 4 и "" в противном случае) Опция "Qt" всегда включена.

Атрибуты:
точкиndarray типа double, форма (npoints, ndim)

Координаты входных точек.

вершиныndarray целых чисел, форма (nvertices,)

Индексы точек, образующих вершины выпуклой оболочки. Для 2-D выпуклых оболочек вершины расположены против часовой стрелки. Для других размерностей они расположены в порядке ввода.

симплексыndarray целых чисел, форма (nfacet, ndim)

Индексы точек, образующих симплициальные грани выпуклой оболочки.

соседиndarray целых чисел, форма (nfacet, ndim)

Индексы соседних граней для каждой грани. k-й сосед противоположен k-й вершине. -1 означает отсутствие соседа.

уравненияndarray типа double, форма (nfacet, ndim+1)

[normal, offset], формирующие уравнение гиперплоскости грани (см. Документация Qhull для получения дополнительной информации).

компланарныйndarray из int, форма (ncoplanar, 3)

Индексы компланарных точек и соответствующие индексы ближайших граней и ближайших вершин. Компланарные точки - это входные точки, которые были не включен в триангуляцию из-за проблем с численной точностью.

Если опция "Qc" не указана, этот список не вычисляется.

хорошоndarray типа bool или None

Одномерный булев массив, указывающий, какие грани являются хорошими. Используется с опциями, вычисляющими хорошие грани, например QGn и QG-n. Хорошие грани определяются как те, которые видны (n) или невидимы (-n) из точки n, где n — n-я точка в 'points'. Атрибут 'good' может использоваться как индекс в 'simplices' для возврата хороших (видимых) граней: simplices[good]. Грань видна только снаружи оболочки, и ни копланарность, ни вырожденность не считаются случаями видимости.

Если опция "QGn" или "QG-n" не указана, возвращается None.

Добавлено в версии 1.3.0.

областьfloat

Площадь поверхности выпуклой оболочки при размерности входных данных > 2. Когда входные points являются двумерными, это периметр выпуклой оболочки.

Добавлено в версии 0.17.0.

объёмfloat

Объём выпуклой оболочки, когда размерность входных данных > 2. Когда входные points являются двумерными, это площадь выпуклой оболочки.

Добавлено в версии 0.17.0.

Методы

add_points(points[, restart])

Обработать набор дополнительных новых точек.

close()

Завершить инкрементную обработку.

Вызывает:
QhullError

Возникает, когда Qhull сталкивается с ошибкой, например, геометрической вырожденностью, когда опции для разрешения не включены.

ValueError

Возникает, если на вход подается несовместимый массив.

Примечания

Выпуклая оболочка вычисляется с использованием Библиотека Qhull.

Ссылки

Примеры

Выпуклая оболочка случайного набора точек:

>>> from scipy.spatial import ConvexHull, convex_hull_plot_2d
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> points = rng.random((30, 2))   # 30 random points in 2-D
>>> hull = ConvexHull(points)

Построить график:

>>> import matplotlib.pyplot as plt
>>> plt.plot(points[:,0], points[:,1], 'o')
>>> for simplex in hull.simplices:
...     plt.plot(points[simplex, 0], points[simplex, 1], 'k-')

Мы также могли бы напрямую использовать вершины оболочки, которые для 2-D гарантированно расположены в порядке против часовой стрелки:

>>> plt.plot(points[hull.vertices,0], points[hull.vertices,1], 'r--', lw=2)
>>> plt.plot(points[hull.vertices[0],0], points[hull.vertices[0],1], 'ro')
>>> plt.show()
../../_images/scipy-spatial-ConvexHull-1_00_00.png

Грани, видимые из точки:

Создайте квадрат и добавьте точку над квадратом.

>>> generators = np.array([[0.2, 0.2],
...                        [0.2, 0.4],
...                        [0.4, 0.4],
...                        [0.4, 0.2],
...                        [0.3, 0.6]])

Вызовите ConvexHull с опцией QG. QG4 означает вычислить части оболочки, не включающие точку 4, указывая грани, которые видны из точки 4.

>>> hull = ConvexHull(points=generators,
...                   qhull_options='QG4')

Массив "good" указывает, какие грани видны из точки 4.

>>> print(hull.simplices)
    [[1 0]
     [1 2]
     [3 0]
     [3 2]]
>>> print(hull.good)
    [False  True False False]

Теперь постройте график, выделяя видимые грани.

>>> fig = plt.figure()
>>> ax = fig.add_subplot(1,1,1)
>>> for visible_facet in hull.simplices[hull.good]:
...     ax.plot(hull.points[visible_facet, 0],
...             hull.points[visible_facet, 1],
...             color='violet',
...             lw=6)
>>> convex_hull_plot_2d(hull, ax=ax)
    
# may vary >>> plt.show()
../../_images/scipy-spatial-ConvexHull-1_01_00.png