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.
Примечания
Обычно этот метод точен на 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.