python中的卷积

一. scipy.signal.convolve方法

两个N维数组的卷积,两个数组的维度必须相同!!!

https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve.html

scipy.signal.convolve(input1, input2, mode=‘full’, method=‘auto’)

参数介绍:
input1:第一个数组
input2:第二个数组
mode:有三个模式( ‘full’, ‘valid’, ‘same’)可选,输出大小与此参数有关。
method:有三个模式 (‘auto’,‘direct’,‘fft’),可选,指用于计算卷积的方法。
(1)direct:卷积是直接从总和(卷积的定义)中确定的。
(2)fft:傅立叶变换用于通过调用进行卷积。
(3)auto:根据估计更快的速度自动选择直接或傅立叶方法(默认)

1. 例子1(一维):

import scipy.signal
input1 = [1, 2, 3, 4, 6, 8]
input2 = [0.1, 0.4, 0.5]
result1 = scipy.signal.convolve(input1, input2)
result2 = scipy.signal.convolve(input1, input2, mode='same')
result3 = scipy.signal.convolve(input1, input2, mode='valid')
print(result1)
print(result2)
print(result3)

结果:

[0.1 0.6 1.6 2.6 3.7 5.2 6.2 4. ]
[0.6 1.6 2.6 3.7 5.2 6.2]
[1.6 2.6 3.7 5.2]

具体运算细节:(数字信号处理,离散信号的卷积)
首先 input2翻转’,即[0.5 , 0.4, 0.1]
(1)默认 mode = ‘full’,有零填充
第一个元素:0.5 x 0 + 0.4 x 0 + 0.1 x 1 = 0.1
第二个元素:0.5 x 0 + 0.4 x 1 + 0.1 x 2 = 0.6

第七个元素:0.5 x 6 + 0.4 x 8 + 0.1 x 0 = 6.2
第八个元素:0.5 x 8 +0.4 x 0 + 0.1 x 0 = 4
(2)mode = ‘same’,输出与input1相同,在 mode = ‘full’ 结果的中心
(3)mode = ‘valid’ ,无零填充,result每个元素都是 input1 和 input2 中的元素相乘再相加得来的,即result中每个元素都是有效的。

2. 例子2(二维):

input1 = [[1, 2, 3], [4, 4, 7], [8, 9, 0]]
input2 = [[0.1, 0.4], [0.3, 0.2]]

输入:在这里插入图片描述
第一步:对卷积核进行旋转在这里插入图片描述
第二步:计算卷积
(1)mode = ‘full’ : 输出是输入的完整离散线性卷积,有零填充。(默认)

第一个元素 output[0][0] :0.2 x 0 + 0.3 x 0 + 0.4 x 0 + 0.1 x 1 = 0.1
第二个元素 output[0][1] :0.2 x 0 + 0.3 x 0 + 0.4 x 1 + 0.1 x 2 = 0.6
第三个元素 output[0][2] :0.2 x 0 + 0.3 x 0 + 0.4 x 2 + 0.1 x 3 = 1.1
第四个元素 output[0][3] :0.2 x 0 + 0.3 x 0 + 0.4 x 0.3 + 0.1 x 0 = 1.2
第五个元素 output[1][0] :0.2 x 0 + 0.3 x 1 + 0.4 x 0 + 0.1 x 4 = 0.7
第六个元素 output[1][1] :0.2 x 1 + 0.3 x 2 + 0.4 x 4 + 0.1 x 4 = 2.8



最终结果在这里插入图片描述
这个结果就是 mode = ‘full’ 的结果。

(2)mode = ‘valid’: 输出仅包含不依赖零填充的那些元素。在“valid”模式下,input1或input2 在每个维度上都必须至少与另一个一样大。

output[0][0] :0.2 x 1 + 0.3 x 2 + 0.4 x 4 + 0.1 x 4 = 2.8
output[0][1] :0.2 x 2 + 0.3 x 3 + 0.4 x 4 + 0.1 x 7 = 3.6
output[1][0] :0.2 x 4 + 0.3 x 4 + 0.4 x 8 + 0.1 x 9 = 6.1
output[1][1] :0.2 x 4 + 0.3 x 7 + 0.4 x 9 + 0.1 x 0 = 6.5
最终结果在这里插入图片描述

(3)mode = ‘same’: 输出与input1相同,在 mode = ‘full’ 结果的中心(本例子在 4x4 矩阵中,故中心结果如下)。

最终结果在这里插入图片描述

二. numpy.convolve方法

只能计算两个一维序列的离散线性卷积

https://numpy.org/doc/stable/reference/generated/numpy.convolve.html

numpy.convolve(input1, input2, mode=‘full’)
参数介绍:
input1:第一个数组(一维,shape为(N, )
input2:第二个数组(一维,shape为(M, )
mode:有三个模式( ‘full’, ‘valid’, ‘same’),同上!
(1)‘full’ : 输出的 shape 为 ( N + M - 1 , )
(2)‘same’: 输出的长度为 max( M , N )
(3)‘valid’: 输出的长度为 max( M , N ) - min( M , N ) + 1.
例子:

input1 = [1, 2, 3, 4, 6, 8]
input2 = [0.1, 0.4, 0.5]
result1 = np.convolve(input1, input2)
result2 = np.convolve(input1, input2, mode='same')
result3 = np.convolve(input1, input2, mode='valid')
print(result1)
print(result2)
print(result3)

结果(与上个小节中的例子一相同):

[0.1 0.6 1.6 2.6 3.7 5.2 6.2 4. ]
[0.6 1.6 2.6 3.7 5.2 6.2]
[1.6 2.6 3.7 5.2]
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐