scipy.signal.

choose_conv_method#

scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[source]#

找出最快的卷積/相關方法。

這主要是為了在 convolvecorrelate 中的 method='auto' 選項被呼叫時使用。它也可以用於確定相同 dtype/shape 的許多不同卷積的 method 值。此外,它支援計時卷積,以根據特定輸入和/或硬體調整 method 的值。

參數:
in1array_like

傳遞到卷積函數的第一個參數。

in2array_like

傳遞到卷積函數的第二個參數。

modestr {‘full’, ‘valid’, ‘same’}, optional

字串,指示輸出的尺寸

full

輸出是輸入的完整離散線性卷積。(預設)

valid

輸出僅包含不依賴於零填充的元素。

same

輸出與 in1 的尺寸相同,相對於 'full' 輸出居中。

measurebool, optional

如果為 True,則使用兩種方法運行並計時 in1in2 的卷積,並返回最快的方法。如果為 False(預設),則使用預先計算的值預測最快的方法。

返回值:
methodstr

字串,指示哪種卷積方法最快,'direct' 或 'fft'

timesdict, optional

字典,包含每種方法所需的時間(以秒為單位)。僅當 measure=True 時才返回此值。

註解

一般來說,對於隨機選擇的輸入尺寸,此方法對於 2D 訊號的準確度為 99%,對於 1D 訊號的準確度為 85%。為了精確度,請使用 measure=True 通過計時卷積來找到最快的方法。這可以用於避免稍後尋找最快 method 的最小開銷,或根據特定輸入調整 method 的值。

為了測試此函數,實驗是在 Amazon EC2 r5a.2xlarge 機器上運行的。這些實驗測量了使用 method='auto' 時所需的時間與最快方法所需的時間之間的比率(即,ratio = time_auto / min(time_fft, time_direct))。在這些實驗中,我們發現

  • 對於 1D 訊號,此比率小於 1.5 的機率為 95%,對於 2D 訊號,此比率小於 2.5 的機率為 99%。

  • 對於 1D/2D 訊號,此比率始終小於 2.5/5。

  • 此函數對於使用 method='direct' 耗時在 1 到 10 毫秒之間的 1D 卷積最不準確。一個好的近似值(至少在我們的實驗中)是 1e6 <= in1.size * in2.size <= 1e7

2D 結果幾乎可以肯定地推廣到 3D/4D/等等,因為實作方式相同(1D 實作方式不同)。

上述所有數字都特定於 EC2 機器。但是,我們發現此函數在不同硬體之間具有相當不錯的通用性。速度測試的品質與在用於調整此函數數字的機器(2014 年中 15 英寸 MacBook Pro,配備 16GB RAM 和 2.5GHz Intel i7 處理器)上執行的相同測試品質相似(甚至略好)。

在某些情況下,fftconvolve 支援輸入,但此函數返回 direct(例如,為了防止浮點整數精度問題)。

在版本 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'

然後可以將其應用於相同 dtype 和 shape 的其他陣列

>>> 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) 可與 correlateconvolve 一起使用。