scipy.signal.
fftconvolve#
- scipy.signal.fftconvolve(in1, in2, mode='full', axes=None)[原始碼]#
使用 FFT 卷積兩個 N 維陣列。
使用快速傅立葉轉換方法卷積 in1 和 in2,輸出大小由 mode 參數決定。
對於大型陣列 (n > ~500),這通常比
convolve
快得多,但當只需要少數輸出值時可能會比較慢,並且只能輸出浮點陣列(整數或物件陣列輸入將被轉換為浮點數)。從 v0.19 開始,
convolve
會根據哪個更快的估計值自動選擇此方法或直接方法。- 參數:
- in1array_like
第一個輸入。
- in2array_like
第二個輸入。應具有與 in1 相同的維度數。
- modestr {‘full’, ‘valid’, ‘same’}, 選項性
指示輸出大小的字串
full
輸出是輸入的完整離散線性卷積。(預設)
valid
輸出僅包含不依賴零填充的元素。在 'valid' 模式下,in1 或 in2 在每個維度上都必須至少與另一個一樣大。
same
輸出與 in1 的大小相同,相對於 'full' 輸出居中。
- axesint 或 int 的 array_like 或 None,選項性
計算卷積的軸。預設值為所有軸。
- 返回:
- outarray
一個 N 維陣列,包含 in1 與 in2 的離散線性卷積的子集。
另請參閱
convolve
根據哪個更快,使用直接卷積或 FFT 卷積演算法。
oaconvolve
使用重疊相加方法進行卷積,當輸入陣列很大且大小差異顯著時,通常更快。
範例
白雜訊的自相關是一個脈衝。
>>> import numpy as np >>> from scipy import signal >>> rng = np.random.default_rng() >>> sig = rng.standard_normal(1000) >>> autocorr = signal.fftconvolve(sig, sig[::-1], mode='full')
>>> import matplotlib.pyplot as plt >>> fig, (ax_orig, ax_mag) = plt.subplots(2, 1) >>> ax_orig.plot(sig) >>> ax_orig.set_title('White noise') >>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)), autocorr) >>> ax_mag.set_title('Autocorrelation') >>> fig.tight_layout() >>> fig.show()
使用 FFT 卷積實作的高斯模糊。請注意影像周圍的黑色邊框,這是由於超出其邊界的零填充所致。
convolve2d
函數允許其他類型的影像邊界,但速度慢得多。>>> from scipy import datasets >>> face = datasets.face(gray=True) >>> kernel = np.outer(signal.windows.gaussian(70, 8), ... signal.windows.gaussian(70, 8)) >>> blurred = signal.fftconvolve(face, kernel, mode='same')
>>> fig, (ax_orig, ax_kernel, ax_blurred) = plt.subplots(3, 1, ... figsize=(6, 15)) >>> ax_orig.imshow(face, cmap='gray') >>> ax_orig.set_title('Original') >>> ax_orig.set_axis_off() >>> ax_kernel.imshow(kernel, cmap='gray') >>> ax_kernel.set_title('Gaussian kernel') >>> ax_kernel.set_axis_off() >>> ax_blurred.imshow(blurred, cmap='gray') >>> ax_blurred.set_title('Blurred') >>> ax_blurred.set_axis_off() >>> fig.show()