choose_conv_method#
- scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[Quelle]#
Finden Sie die schnellste Faltungs-/Korrelationsmethode.
Dies dient hauptsächlich dazu, während der Option
method='auto'inconvolveundcorrelateaufgerufen zu werden. Sie kann auch verwendet werden, um den Wert vonmethodfür viele verschiedene Faltungen desselben dtypes/shapes zu ermitteln. Darüber hinaus unterstützt sie das Zeitmessen der Faltung, um den Wert vonmethodan einen bestimmten Satz von Eingaben und/oder Hardware anzupassen.- Parameter:
- in1array_like
Das erste an die Faltungsfunktion übergebene Argument.
- in2array_like
Das zweite an die Faltungsfunktion übergebene Argument.
- modestr {‘full’, ‘valid’, ‘same’}, optional
Ein String, der die Größe der Ausgabe angibt
fullDie Ausgabe ist die vollständige diskrete lineare Faltung der Eingaben. (Standard)
validDie Ausgabe enthält nur die Elemente, die nicht auf die Nullauffüllung angewiesen sind.
sameDie Ausgabe hat die gleiche Größe wie in1 und ist zentriert bezüglich der 'full'-Ausgabe.
- measurebool, optional
Wenn True, führen Sie die Faltung von in1 und in2 mit beiden Methoden aus, messen Sie die Zeit und geben Sie die schnellste zurück. Wenn False (Standard), prognostizieren Sie die schnellste Methode anhand von vorab berechneten Werten.
- Rückgabe:
- methodstr
Ein String, der angibt, welche Faltungsmethode am schnellsten ist, entweder 'direct' oder 'fft'.
- timesdict, optional
Ein Wörterbuch, das die benötigten Zeiten (in Sekunden) für jede Methode enthält. Dieser Wert wird nur zurückgegeben, wenn
measure=Trueist.
Hinweise
Im Allgemeinen ist diese Methode bei zufällig gewählten Eingabegrößen für 2D-Signale zu 99% und für 1D-Signale zu 85% genau. Für Präzision verwenden Sie
measure=True, um die schnellste Methode durch Zeitmessung der Faltung zu finden. Dies kann verwendet werden, um den minimalen Overhead bei der Suche nach der schnellstenmethodspäter zu vermeiden oder um den Wert vonmethodan einen bestimmten Satz von Eingaben anzupassen.Experimente wurden auf einer Amazon EC2 r5a.2xlarge-Maschine durchgeführt, um diese Funktion zu testen. Diese Experimente maßen das Verhältnis zwischen der Zeit, die bei Verwendung von
method='auto'benötigt wurde, und der Zeit, die für die schnellste Methode benötigt wurde (d. h.ratio = time_auto / min(time_fft, time_direct)). Bei diesen Experimenten stellten wir fest:Es besteht eine 95%ige Wahrscheinlichkeit, dass dieses Verhältnis für 1D-Signale kleiner als 1,5 und für 2D-Signale kleiner als 2,5 ist.
Das Verhältnis war für 1D-/2D-Signale immer kleiner als 2,5/5.
Diese Funktion ist am ungenauesten für 1D-Faltungen, die zwischen 1 und 10 Millisekunden mit
method='direct'dauern. Ein guter Näherungswert dafür (zumindest in unseren Experimenten) ist1e6 <= in1.size * in2.size <= 1e7.
Die 2D-Ergebnisse verallgemeinern sich mit ziemlicher Sicherheit auf 3D/4D/etc, da die Implementierung dieselbe ist (die 1D-Implementierung ist anders).
Alle oben genannten Zahlen sind spezifisch für die EC2-Maschine. Wir haben jedoch festgestellt, dass diese Funktion relativ gut auf verschiedenen Hardwaregeräten verallgemeinert. Die Geschwindigkeitstests waren von ähnlicher Qualität (und sogar leicht besser) als die gleichen Tests, die auf der Maschine durchgeführt wurden, um die Zahlen dieser Funktion zu optimieren (ein MacBook Pro von Mitte 2014 mit 15 Zoll, 16 GB RAM und einem 2,5 GHz Intel i7 Prozessor).
Es gibt Fälle, in denen
fftconvolvedie Eingaben unterstützt, diese Funktion aber direct zurückgibt (z. B. zum Schutz vor Gleitkomma-Integer-Genauigkeit).Hinzugefügt in Version 0.19.
Beispiele
Schätzen Sie die schnellste Methode für eine gegebene Eingabe
>>> 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'
Dies kann dann auf andere Arrays mit demselben dtype und Shape angewendet werden
>>> 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)
Die Ausgabe dieser Funktion (
method) funktioniert mitcorrelateundconvolve.