我试图通过两个尺寸将Xarray从4 x 4减少到2 x 2。我没有发现当前的Xarray数据集有任何运气。 这些是我遵循的步骤。我想根据纬度和经度来进行分类或分组。
a = np.array(np.random.randint(1, 90+1,(4,4)),dtype=np.float64)
b = np.array(np.random.randint(1, 360+1,(4,4)),dtype=np.float64)
c = np.random.random_sample(16,)
c = c.reshape(4,4)
dsa = xr.Dataset()
dsa['CloudFraction'] = (('x', 'y'), c)
dsa.coords['latitude'] = (('x', 'y'), a)
dsa.coords['longitude'] = (('x', 'y'), b)
dsa
尺寸:(x:4,y:4)
坐标:
latitude (x, y) float64 23.0 16.0 53.0 1.0 ... 82.0 65.0 45.0 88.0
longitude (x, y) float64 219.0 13.0 276.0 69.0 ... 156.0 277.0 16.0
不含坐标的尺寸:x,y
数据变量:
CloudFraction (x, y) float64 0.1599 0.05671 0.8624 ... 0.7757 0.7572
答案 0 :(得分:0)
忠诚。
对于我们的示例,我们可以使用rolling
方法来实现(移动)合并。
沿x轴进行装箱的一种简单方法是
In [14]: dsa.rolling(x=2).mean().isel(x=slice(1, None, 2))
Out[14]:
<xarray.Dataset>
Dimensions: (x: 2, y: 4)
Coordinates:
latitude (x, y) float64 9.0 61.0 58.0 57.0 23.0 38.0 10.0 75.0
longitude (x, y) float64 198.0 177.0 303.0 71.0 163.0 213.0 55.0 102.0
Dimensions without coordinates: x, y
Data variables:
CloudFraction (x, y) float64 0.2882 0.7061 0.9226 ... 0.5084 0.2377 0.6352
这实际上计算的是窗口大小为2的移动平均值,然后是步长为2的子样本。
由于mean
操作是线性的,因此您可以依次对y轴执行相同的操作。
上述操作浪费了一点计算资源,因为我们只使用了一半的计算值。
为了避免这种情况,我们可以改用construct
方法
In [18]: dsa.rolling(x=2).construct('tmp').isel(x=slice(1, None, 2)).mean('tmp')
...:
Out[18]:
<xarray.Dataset>
Dimensions: (x: 2, y: 4)
Coordinates:
latitude (x, y) float64 9.0 61.0 58.0 57.0 23.0 38.0 10.0 75.0
longitude (x, y) float64 198.0 177.0 303.0 71.0 163.0 213.0 55.0 102.0
Dimensions without coordinates: x, y
Data variables:
CloudFraction (x, y) float64 0.2882 0.7061 0.9226 ... 0.5084 0.2377 0.6352
有关滚动方法的详细信息,请参见官方页面 http://xarray.pydata.org/en/stable/computation.html#rolling-window-operations
我个人认为,如果xarray为此目的使用bin
方法,那将是很好的。
如果您不介意,请在Github问题页面上进行讨论。