Numpy:修改某些位置的数组元素

时间:2016-05-05 02:29:30

标签: python arrays numpy conv-neural-network

我有一个数组a:

j-9YWMBYN98LN7

我还有一个面具b:

array([[[[14, 59, 18, 92],
     [91, 38, 58, 23],
     [33, 52, 93, 68],
     [19, 21, 50, 77]],

    [[90, 37, 22, 55],
     [56, 54, 10, 16],
     [83, 20, 36,  3],
     [84, 87, 85, 81]]],

   [[[ 0, 45, 72,  5],
     [49, 46, 94, 53],
     [34, 51, 75,  8],
     [27, 79, 35, 15]],

    [[ 7, 86, 64, 31],
     [12, 70, 89, 62],
     [13, 63, 88, 25],
     [39, 11, 26,  6]]]])

如何修改数组a的那些元素,这些元素对应于掩码b中的元素?

特别是,我有一个数组c:

array([[[[ 0.,  0.,  0.,  1.],
     [ 1.,  0.,  0.,  0.],
     [ 0.,  1.,  1.,  0.],
     [ 0.,  0.,  0.,  0.]],

    [[ 0.,  0.,  0.,  0.],
     [ 1.,  0.,  1.,  0.],
     [ 0.,  0.,  0.,  0.],
     [ 0.,  1.,  1.,  0.]]],

   [[[ 0.,  0.,  0.,  0.],
     [ 1.,  0.,  1.,  0.],
     [ 0.,  0.,  1.,  0.],
     [ 0.,  1.,  0.,  0.]],

    [[ 0.,  1.,  0.,  0.],
     [ 0.,  0.,  1.,  0.],
     [ 0.,  1.,  1.,  0.],
     [ 0.,  0.,  0.,  0.]]]])

如何将c添加到a中,以便只将掩码b指示的元素添加到?

(这是我需要做的,通过卷积神经网络中的最大池层来反向传播错误)

1 个答案:

答案 0 :(得分:4)

如果将b解释为布尔掩码,那将非常容易:

b_mask = b.astype(bool)
d = a.copy()
d[b_mask] = a[b_mask] + c.ravel()
d

给我

array([[[[ 14,  59,  18,  92],
         [ 92,  38,  58,  23],
         [ 33,  54,  96,  68],
         [ 19,  21,  50,  77]],

        [[ 90,  37,  22,  55],
         [ 60,  54,  15,  16],
         [ 83,  20,  36,   3],
         [ 84,  93,  92,  81]]],


       [[[  0,  45,  72,   5],
         [ 57,  46, 103,  53],
         [ 34,  51,  85,   8],
         [ 27,  90,  35,  15]],

        [[  7,  98,  64,  31],
         [ 12,  70, 102,  62],
         [ 13,  77, 103,  25],
         [ 39,  11,  26,   6]]]])

或者如果你想要就地:

b_mask = b.astype(bool)
a[b_mask] = a[b_mask] + c.ravel()