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

替换xarray中的零值

  •  1
  • JackLidge  · 技术社区  · 6 年前

    我有一个xarray数据集,其中有三个独立的4x4矩阵,当前填充了随机值。

    我可以屏蔽每个4x4矩阵,这样所有等于零的值都是nan,我想用下一个矩阵的值替换那些nan值。

    import numpy as np
    import xarray as xr
    
    dval = np.random.randint(5,size=[3,4,4])
    
    x = [0,1,2,3]
    y = [0,1,2,3]
    time = ['2017-10-13','2017-10-12','2017-10-11']
    
    a = xr.DataArray(dval,coords=[time,x,y],dims=['time','x','y'])
    
    a = a.where(a > 0)
    b = a.sel(time = time[0]).to_masked_array()
    

    我想做的是,用4x4矩阵中对应于“2017-10-12”的值替换b中被掩盖为False的任何值。任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  1
  •   shoyer    6 年前

    你可以利用 ffill() bfill()

    import numpy as np
    import xarray as xr
    
    dval = np.random.RandomState(0).randint(5,size=[3,4,4])
    
    x = [0,1,2,3]
    y = [0,1,2,3]
    time = ['2017-10-13','2017-10-12','2017-10-11']
    
    a = xr.DataArray(dval,coords=[time,x,y],dims=['time','x','y'])
    a = a.where(a > 0)
    filled = a.bfill('time')
    

    结果:

    >>> a
    <xarray.DataArray (time: 3, x: 4, y: 4)>
    array([[[ 4., nan,  3.,  3.],
            [ 3.,  1.,  3.,  2.],
            [ 4., nan, nan,  4.],
            [ 2.,  1., nan,  1.]],
    
           [[ 1., nan,  1.,  4.],
            [ 3., nan,  3., nan],
            [ 2.,  3., nan,  1.],
            [ 3.,  3.,  3., nan]],
    
           [[ 1.,  1.,  1., nan],
            [ 2.,  4.,  3.,  3.],
            [ 2.,  4.,  2., nan],
            [nan,  4., nan,  4.]]])
    Coordinates:
      * time     (time) <U10 '2017-10-13' '2017-10-12' '2017-10-11'
      * x        (x) int64 0 1 2 3
      * y        (y) int64 0 1 2 3
    
    >>> filled
    <xarray.DataArray (time: 3, x: 4, y: 4)>
    array([[[ 4.,  1.,  3.,  3.],
            [ 3.,  1.,  3.,  2.],
            [ 4.,  3.,  2.,  4.],
            [ 2.,  1.,  3.,  1.]],
    
           [[ 1.,  1.,  1.,  4.],
            [ 3.,  4.,  3.,  3.],
            [ 2.,  3.,  2.,  1.],
            [ 3.,  3.,  3.,  4.]],
    
           [[ 1.,  1.,  1., nan],
            [ 2.,  4.,  3.,  3.],
            [ 2.,  4.,  2., nan],
            [nan,  4., nan,  4.]]])
    Coordinates:
      * time     (time) <U10 '2017-10-13' '2017-10-12' '2017-10-11'
      * x        (x) int64 0 1 2 3
      * y        (y) int64 0 1 2 3
    

    interpolate_na() 方法对于这些情况也很方便(但在这种特殊情况下不方便)。