替换 xarray 中的零值
Replace zero values in an xarray
我有一个 xarray 数据集,其中包含三个独立的 4x4 矩阵,目前填充了随机值。
我可以屏蔽每个 4x4 矩阵,以便所有等于零的值都是 nan,我想用下一个矩阵中的值替换这些 nan 值。
这最终将扩展到非常大的卫星图像阵列,因此我可以根据 "last best pixel" 执行搜索和创建图像。以下是我目前参考的代码:
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 矩阵中的值。如有任何帮助,我们将不胜感激。
您可以使用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()
方法也可以方便地用于这些情况(但不是在这种特殊情况下)。
我有一个 xarray 数据集,其中包含三个独立的 4x4 矩阵,目前填充了随机值。
我可以屏蔽每个 4x4 矩阵,以便所有等于零的值都是 nan,我想用下一个矩阵中的值替换这些 nan 值。
这最终将扩展到非常大的卫星图像阵列,因此我可以根据 "last best pixel" 执行搜索和创建图像。以下是我目前参考的代码:
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 矩阵中的值。如有任何帮助,我们将不胜感激。
您可以使用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()
方法也可以方便地用于这些情况(但不是在这种特殊情况下)。