scipy.spatial.distance.

directed_hausdorff#

scipy.spatial.distance.directed_hausdorff(u, v, rng=0, *, seed=None)[источник]#

Вычислить направленное расстояние Хаусдорфа между двумя двумерными массивами.

Расстояния между парами вычисляются с использованием евклидовой метрики.

Параметры:
u(M,N) array_like

Входной массив с M точками в N измерениях.

v(O,N) array_like

Входной массив с O точками в N измерениях.

rngint или numpy.random.Generator или None, опционально

Состояние генератора псевдослучайных чисел. По умолчанию 0, поэтому перемешивание u и v воспроизводим.

Если rng передается по ключевому слову, типы, отличные от numpy.random.Generator передаются в numpy.random.default_rng для создания экземпляра Generator. Если rng уже является Generator экземпляра, то предоставленный экземпляр используется.

Если этот аргумент передаётся по позиции или seed передается по ключевому слову, устаревшее поведение для аргумента seed применяется:

  • Если seed равно None, новый RandomState используется экземпляр. Состояние инициализируется с использованием данных из /dev/urandom (или Windows-аналог) если доступно, или из системных часов в противном случае.

  • Если seed является int, новый RandomState используется экземпляр, инициализированный с seed.

  • Если seed уже является Generator или RandomState экземпляр, то используется этот экземпляр.

Изменено в версии 1.15.0: В рамках SPEC-007 переход от использования numpy.random.RandomState to numpy.random.Generator, этот ключевое слово было изменено с seed to rng. В переходный период оба ключевых слова будут продолжать работать, хотя только одно может быть указано за раз. После переходного периода вызовы функций с использованием seed ключевое слово будет выдавать предупреждения. Поведение обоих seed и rng описаны выше, но только rng ключевое слово должно использоваться в новом коде.

Возвращает:
ddouble

Направленное расстояние Хаусдорфа между массивами u и v,

index_1int

индекс точки, вносящей вклад в пару Хаусдорфа в u

index_2int

индекс точки, вносящей вклад в пару Хаусдорфа в v

Вызывает:
ValueError

Исключение выбрасывается, если u и v не имеют одинакового количества столбцов.

Смотрите также

scipy.spatial.procrustes

Ещё один тест на схожесть для двух наборов данных

Примечания

Использует технику раннего прерывания и подход случайной выборки, описанный [1]. Хотя наихудшая производительность O(m * o) (как в алгоритме полного перебора), это маловероятно на практике, так как входные данные должны требовать от алгоритма исследования каждого отдельного взаимодействия точек, и после того, как алгоритм перемешивает входные точки в этот момент. Наилучшая производительность — O(m), что достигается выбором расстояния внутреннего цикла, меньшего, чем cmax, и приводящего к раннему прерыванию как можно чаще. Авторы формально показали, что среднее время выполнения ближе к O(m).

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

Ссылки

[1]

А. А. Таха и А. Ханбери, «Эффективный алгоритм вычисления точного расстояния Хаусдорфа». IEEE Transactions On Pattern Analysis And Machine Intelligence, т. 37 стр. 2153-63, 2015.

Примеры

Найти направленное расстояние Хаусдорфа между двумя двумерными массивами координат:

>>> from scipy.spatial.distance import directed_hausdorff
>>> import numpy as np
>>> u = np.array([(1.0, 0.0),
...               (0.0, 1.0),
...               (-1.0, 0.0),
...               (0.0, -1.0)])
>>> v = np.array([(2.0, 0.0),
...               (0.0, 2.0),
...               (-2.0, 0.0),
...               (0.0, -4.0)])
>>> directed_hausdorff(u, v)[0]
2.23606797749979
>>> directed_hausdorff(v, u)[0]
3.0

Нахождение общего (симметричного) расстояния Хаусдорфа между двумя 2-D массивами координат:

>>> max(directed_hausdorff(u, v)[0], directed_hausdorff(v, u)[0])
3.0

Найти индексы точек, которые генерируют расстояние Хаусдорфа (пара Хаусдорфа):

>>> directed_hausdorff(v, u)[1:]
(3, 3)