scipy.signal.

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' in convolve und correlate aufgerufen zu werden. Sie kann auch verwendet werden, um den Wert von method für viele verschiedene Faltungen desselben dtypes/shapes zu ermitteln. Darüber hinaus unterstützt sie das Zeitmessen der Faltung, um den Wert von method an 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

full

Die Ausgabe ist die vollständige diskrete lineare Faltung der Eingaben. (Standard)

valid

Die Ausgabe enthält nur die Elemente, die nicht auf die Nullauffüllung angewiesen sind.

same

Die 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=True ist.

Siehe auch

convolve
correlate

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 schnellsten method später zu vermeiden oder um den Wert von method an 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) ist 1e6 <= 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 fftconvolve die 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 mit correlate und convolve.