使用 Xarray 计算每个值的出现次数

Counting occurences of each value with Xarray

我是 Xarray 的新手,正在尝试使用它对繁重的 tif 文件进行分析(不适合内存,必须将它们分块)。 我想获取数据集中每个类别的像素数(单波段栅格,大约有 20 个类别)。目标是计算值在选定区域的分布。 我看到了 但它因为内存使用而崩溃了。

我该如何继续?

xhistogram 包正是这样做的。它是新的并且正在积极开发中,但它设计用于开箱即用的 xarray 和分块 dask 数组。

举个例子,假设我有一个带有 dims (x, y, time):

的 3-D 数组
In [1]: import xarray as xr, numpy as np, pandas as pd
   ...:
   ...: x = np.linspace(-110, -90, 5)
   ...: y = np.linspace(23, 30, 5)
   ...: time = pd.date_range('1990-01-01', '2100-12-01', freq='MS')
   ...:
   ...: da = xr.DataArray(
   ...:     np.random.random(size=(5, 5, len(time))),
   ...:     dims=['x', 'y', 'time'],
   ...:     coords=[x, y, time],
   ...:     name='temperature',
   ...: )

xhistogram.xarray.histogram 将 xr.DataArray 作为参数以及沿任意数量维度的 bin 规范,保留剩余维度并有效地计算沿提供的 dim(s) 的 bin 频率:

In [2]: from xhistogram.xarray import histogram

In [3]: binned = histogram(da, dim=['x', 'y'], bins=[np.linspace(0, 1, 5)])

In [4]: binned
Out[4]:
<xarray.DataArray 'histogram_temperature' (time: 1332, temperature_bin: 4)>
array([[ 7,  4,  7,  7],
       [ 4,  5,  6, 10],
       [ 6,  7,  6,  6],
       ...,
       [ 8,  9,  6,  2],
       [10,  5,  5,  5],
       [ 6,  5,  5,  9]])
Coordinates:
  * time             (time) datetime64[ns] 1990-01-01 1990-02-01 ... 2100-12-01
  * temperature_bin  (temperature_bin) float64 0.125 0.375 0.625 0.875

它甚至可以计算多个输入数组之间的联合密度。有关详细信息,请参阅 xhistogram tutorial