XArray-对4 x4到2 x 2的样本数据集进行多维装箱和阵列缩减

时间:2018-10-19 06:08:01

标签: python arrays python-3.x numpy python-xarray

我试图通过两个尺寸将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

1 个答案:

答案 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问题页面上进行讨论。