为了账号安全,请及时绑定邮箱和手机立即绑定

如何在python中执行反向相关/卷积

如何在python中执行反向相关/卷积

浮云间 2022-07-05 17:38:10
我试图在 2 个矩阵上执行反向相关(至少我认为它是这样的)以获得结果矩阵。注意:反向卷积也有效,因为我将其应用于 CNN。我有以下两个矩阵:vals:[[ 2  1 -3 -4 -4] [ 2 -3  3  1  2] [ 2  5 -6  6 -2] [-5  4  1  5  4] [ 0  0  1 -3 -4]]w0:[[[0,  1, -1],  [1, -1,  0],  [0,  0,  0]], [[1,  0,  0],  [0, -1,  1],  [1,  0,  1]], [[ 1, -1,  0],  [-1,  0, -1],  [-1,  0,  1]]]我本质上想应用一个滑动窗口,除了在这种情况下,所有的值w0都乘以 中每个点的标量值vals,然后加上相邻的值。假设步幅为 1,填充相同(wrt vals),下面的代码给出了我想要的结果:concat = np.zeros((3,7,7))for k in range(len(w0)):    for i in range(len(vals)):        for j in range(len(vals[i])):            v = w0[k] * vals[i][j]            concat[k][i:i+v.shape[0], j:j+v.shape[1]] += vprint(concat)导致:[[[  0.   2.  -1.  -4.  -1.   0.   4.]  [  2.   1.  -9.   5.  -2.   5.  -2.]  [  2.  -3.   9. -13.  13. -10.   2.]  [  2.  -2.  -2.   9.  -4.   1.  -4.]  [ -5.   9.  -3.   5.  -5.  -5.   4.]  [  0.   0.   1.  -4.  -1.   4.   0.]  [  0.   0.   0.   0.   0.   0.   0.]] [[  2.   1.  -3.  -4.  -4.   0.   0.]  [  2.  -5.   4.   5.   3.   0.  -4.]  [  4.   4.  -2.  -3.  -7.  -5.  -2.]  [ -3.  -1.   3.  14.  -3.   9.   0.]  [  2.  10. -12.  11. -16.   7.   2.]  [ -5.   4.  -4.   8.   9.   6.   0.]  [  0.   0.   1.  -3.  -3.  -3.  -4.]] [[  2.  -1.  -4.  -1.   0.   4.   0.]  [  0.  -6.   7.   1.   8.   2.   4.]  [ -2.   5. -11.  19. -12.  -3.  -6.]  [ -9.   7.   0. -11.   8.  -9.   4.]  [  3.  -9.  13. -14. -10.   5.  -6.]  [  5.  -4.  -7.   2.   0.   8.   8.]  [  0.   0.  -1.   3.   5.  -3.  -4.]]]然后我会缩小以排除填充,所以:print(concat[:,1:-1, 1:-1])>>> [[[  1.  -9.   5.  -2.   5.]      [ -3.   9. -13.  13. -10.]      [ -2.  -2.   9.  -4.   1.]      [  9.  -3.   5.  -5.  -5.]      [  0.   1.  -4.  -1.   4.]]     [[ -5.   4.   5.   3.   0.]      [  4.  -2.  -3.  -7.  -5.]      [ -1.   3.  14.  -3.   9.]      [ 10. -12.  11. -16.   7.]      [  4.  -4.   8.   9.   6.]]两个结果中的任何一个concat都可以,但最好是包含填充的那个。有谁知道不使用python循环的方法?我更喜欢使用 numpy 或其他一些库,因为它一定会比我的代码更快地执行相同的计算。
查看完整描述

2 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

scipy.signal的convolve实际上是你想要的:


from scipy.signal import convolve


convolve(vals[None, :, :], w0)[:, 1:-1, 1:-1]

Out[]: 

array([[[  1,  -9,   5,  -2,   5],

        [ -3,   9, -13,  13, -10],

        [ -2,  -2,   9,  -4,   1],

        [  9,  -3,   5,  -5,  -5],

        [  0,   1,  -4,  -1,   4]],


       [[ -5,   4,   5,   3,   0],

        [  4,  -2,  -3,  -7,  -5],

        [ -1,   3,  14,  -3,   9],

        [ 10, -12,  11, -16,   7],

        [  4,  -4,   8,   9,   6]],


       [[ -6,   7,   1,   8,   2],

        [  5, -11,  19, -12,  -3],

        [  7,   0, -11,   8,  -9],

        [ -9,  13, -14, -10,   5],

        [ -4,  -7,   2,   0,   8]]])


查看完整回答
反对 回复 2022-07-05
?
慕少森

TA贡献2019条经验 获得超9个赞

你可以看看scipy.ndimage.filters.convolve


例如:


>>> a = np.array([[1, 2, 0, 0],

....    [5, 3, 0, 4],

....    [0, 0, 0, 7],

....    [9, 3, 0, 0]])

>>> k = np.array([[1,1,1],[1,1,0],[1,0,0]])

>>> from scipy import ndimage

>>> ndimage.convolve(a, k, mode='constant', cval=0.0)

array([[11, 10,  7,  4],

       [10,  3, 11, 11],

       [15, 12, 14,  7],

       [12,  3,  7,  0]])


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信