numpy.convolve#

numpy.convolve(a, v, mode='full')[原始碼]#

傳回兩個一維序列的離散線性迴旋。

迴旋運算子常見於訊號處理中,它模擬線性時不變系統對訊號的影響 [1]。在機率論中,兩個獨立隨機變數的總和根據其個別分佈的迴旋分佈。

如果 va 長,則在計算前會交換陣列。

參數:
a(N,) array_like

第一個一維輸入陣列。

v(M,) array_like

第二個一維輸入陣列。

mode{‘full’, ‘valid’, ‘same’}, 可選
‘full’

預設情況下,mode 為 ‘full’。這會傳回每個重疊點的迴旋,輸出形狀為 (N+M-1,)。在迴旋的端點,訊號不會完全重疊,並且可能會看到邊界效應。

‘same’

Mode ‘same’ 傳回長度為 max(M, N) 的輸出。邊界效應仍然可見。

‘valid’

Mode ‘valid’ 傳回長度為 max(M, N) - min(M, N) + 1 的輸出。迴旋乘積僅針對訊號完全重疊的點給出。訊號邊界之外的值沒有影響。

傳回:
outndarray

av 的離散線性迴旋。

另請參閱

scipy.signal.fftconvolve

使用快速傅立葉轉換迴旋兩個陣列。

scipy.linalg.toeplitz

用於建構迴旋運算子。

polymul

多項式乘法。與 convolve 相同的輸出,但也接受 poly1d 物件作為輸入。

註解

離散迴旋運算定義為

\[(a * v)_n = \sum_{m = -\infty}^{\infty} a_m v_{n - m}\]

可以證明,時間/空間中的迴旋 \(x(t) * y(t)\) 等效於傅立葉域中的乘法 \(X(f) Y(f)\),在適當的填充後(填充是防止循環迴旋所必需的)。由於乘法比迴旋更有效率(更快),因此函數 scipy.signal.fftconvolve 利用 FFT 來計算大型資料集的迴旋。

參考文獻

[1]

Wikipedia, “Convolution”, https://en.wikipedia.org/wiki/Convolution

範例

請注意迴旋運算子如何在「滑動」兩個陣列彼此滑動之前翻轉第二個陣列

>>> import numpy as np
>>> np.convolve([1, 2, 3], [0, 1, 0.5])
array([0. , 1. , 2.5, 4. , 1.5])

僅傳回迴旋的中間值。包含邊界效應,其中將零考慮在內

>>> np.convolve([1,2,3],[0,1,0.5], 'same')
array([1. ,  2.5,  4. ])

兩個陣列的長度相同,因此只有一個位置它們完全重疊

>>> np.convolve([1,2,3],[0,1,0.5], 'valid')
array([2.5])