【问题标题】:Replace zero values in an xarray替换 xarray 中的零值
【发布时间】:2018-11-14 03:01:15
【问题描述】:

我有一个 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()

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

【问题讨论】:

    标签: python-3.x python-xarray


    【解决方案1】:

    您可以使用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() 方法对于这些情况也很方便(但在这种特殊情况下不是这样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 2018-01-05
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多