numpy.convolve#
- numpy.convolve(a, v, mode='full')[原始碼]#
傳回兩個一維序列的離散線性迴旋。
迴旋運算子常見於訊號處理中,它模擬線性時不變系統對訊號的影響 [1]。在機率論中,兩個獨立隨機變數的總和根據其個別分佈的迴旋分佈。
如果 v 比 a 長,則在計算前會交換陣列。
- 參數:
- 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
a 和 v 的離散線性迴旋。
另請參閱
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])