代码之家  ›  专栏  ›  技术社区  ›  Mattijn

更新未屏蔽的numpy数组

  •  2
  • Mattijn  · 技术社区  · 9 年前

    我的问题有两个方面

    首先,假设我有两个numpy数组,它们被部分屏蔽

    array_old
    [[-- -- -- --]
     [10 11 -- --]
     [12 14 -- --]
     [-- -- 17 --]]
    
    array_update
    [[--  5 -- --]
     [-- --  9 --]
     [-- 15  8 13]
     [-- -- 19 16]]
    

    如何创建一个新数组,其中所有非屏蔽值都会更新或修改,如:

    array_new
    [[--  5 -- --]
     [10 11  9 --]
     [12 15  8 13]
     [-- -- 19 16]]
    

    其次 如果可能,如何在3d numpy阵列中执行上述操作?

    更新:

    对于第二部分,现在我使用For循环,使用 @freidrichen 方法如下:

    array = np.ma.masked_equal([[[0, 0, 0, 0], [10, 11, 0, 0], [12, 14, 0, 0], [0, 0, 17, 0]],[[0, 5, 0, 0], [0, 0, 9, 0], [0, 15, 8, 13], [0, 0, 19, 16]],[[0, 0, 0, 0], [5, 0, 0, 13], [8, 14, 0, 0], [0, 0, 17, 0]],[[6, 7, 8, 9], [0, 0, 0, 0], [0, 0, 0, 21], [0, 0, 0, 0]]], 0)
    
    a = array[0,::]
    for ix in range(array.shape[0] - 1):
        b = array[ix,::] 
        c = array[ix+1,::]
        b[~c.mask] = c.compressed()
        a[~b.mask] = b.compressed()
    

    不确定这是不是最好的解决方案

    1 回复  |  直到 9 年前
        1
  •  5
  •   freidrichen    9 年前

    使用 a[~b.mask] = b.compressed() .

    a[~b.mask] 选择中的所有值 a 哪里 b 没有被掩盖。 b.compressed() 是一个包含所有非屏蔽值的平坦数组 b .

    例子:

    >>> a = np.ma.masked_equal([[0, 0, 0, 0], [10, 11, 0, 0], [12, 14, 0, 0], [0, 0, 17, 0]], 0)
    >>> b = np.ma.masked_equal([[0, 5, 0, 0], [0, 0, 9, 0], [0, 15, 8, 13], [0, 0, 19, 16]], 0)
    >>> a[~b.mask] = b.compressed()
    >>> a
    [[-- 5 -- --]
    [10 11 9 --]
    [12 15 8 13]
    [-- -- 19 16]]
    

    这也适用于3d阵列。