scipy.signal.

choose_conv_method#

scipy.signal.choose_conv_method(in1, in2, mode='full', измерение=False)[источник]#

Найти самый быстрый метод свертки/корреляции.

Это в основном существует для вызова во время method='auto' опция в convolve и correlate. Также может использоваться для определения значения method для многих различных сверток одного dtype/shape. Кроме того, он поддерживает тайминг свертки для адаптации значения method к определённому набору входных данных и/или оборудованию.

Параметры:
in1array_like

Первый аргумент, передаваемый в функцию свертки.

in2array_like

Второй аргумент, передаваемый в функцию свёртки.

modestr {‘full’, ‘valid’, ‘same’}, необязательный

Строка, указывающая размер вывода:

full

Выходные данные — полная дискретная линейная свёртка входных данных. (По умолчанию)

valid

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

same

Выходные данные имеют тот же размер, что и in1, центрированный относительно вывода 'full'.

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

Если True, выполнить и замерить время свертки in1 и in2 с обоими методами и вернуть самый быстрый. Если False (по умолчанию), предсказать самый быстрый метод с использованием предварительно вычисленных значений.

Возвращает:
методstr

Строка, указывающая, какой метод свертки быстрее: либо 'direct', либо 'fft'

разdict, optional

Словарь, содержащий время (в секундах), необходимое для каждого метода. Это значение возвращается только если measure=True.

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

convolve
correlate

Примечания

Обычно этот метод точен на 99% для 2D сигналов и на 85% для 1D сигналов при случайно выбранных размерах входных данных. Для точности используйте measure=True чтобы найти самый быстрый метод, замеряя время свертки. Это можно использовать, чтобы избежать минимальных накладных расходов на поиск самого быстрого method позже, или адаптировать значение method к определенному набору входных данных.

Эксперименты проводились на машине Amazon EC2 r5a.2xlarge для тестирования этой функции. Эти эксперименты измеряли соотношение между временем, требуемым при использовании method='auto' и время, необходимое для самого быстрого метода (т.е., ratio = time_auto / min(time_fft, time_direct)). В этих экспериментах мы обнаружили:

  • Существует 95% вероятность того, что это соотношение будет меньше 1.5 для 1D сигналов и 99% вероятность того, что оно будет меньше 2.5 для 2D сигналов.

  • Отношение всегда было меньше 2.5/5 для 1D/2D сигналов соответственно.

  • Эта функция наименее точна для 1D сверток, которые занимают от 1 до 10 миллисекунд с method='direct'. Хорошим приближением для этого (по крайней мере, в наших экспериментах) является 1e6 <= in1.size * in2.size <= 1e7.

2D результаты почти наверняка обобщаются на 3D/4D/и т.д., потому что реализация одинакова (1D реализация отличается).

Все числа выше специфичны для машины EC2. Однако мы обнаружили, что эта функция довольно хорошо обобщается на различное оборудование. Скоростные тесты были аналогичного качества (и даже немного лучше), чем те же тесты, выполненные на машине для настройки чисел этой функции (15-дюймовый MacBook Pro середины 2014 года с 16 ГБ ОЗУ и процессором Intel i7 2,5 ГГц).

Бывают случаи, когда fftconvolve поддерживает входные данные, но эта функция возвращает прямой (например, для защиты от целочисленной точности с плавающей запятой).

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

Примеры

Оцените самый быстрый метод для заданного ввода:

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> img = rng.random((32, 32))
>>> filter = rng.random((8, 8))
>>> method = signal.choose_conv_method(img, filter, mode='same')
>>> method
'fft'

Это затем может быть применено к другим массивам того же типа данных и формы:

>>> img2 = rng.random((32, 32))
>>> filter2 = rng.random((8, 8))
>>> corr2 = signal.correlate(img2, filter2, mode='same', method=method)
>>> conv2 = signal.convolve(img2, filter2, mode='same', method=method)

Выход этой функции (method) работает с correlate и convolve.