具有掩码数组的 xarray,同时保留整数数据类型

ger*_*rit 8 python python-xarray masked-array

目前,我的代码大量使用具有多维数据类型的结构化掩码数组,其中包含数十个字段和数千字节的项目大小。看起来这xarray可能是一个很好的选择,但是当我尝试向它传递一个掩码数组时,它会将其数据类型更改为 float:

In [137]: x = arange(30, dtype="i1").reshape(3, 10)

In [138]: xr.Dataset({"count": (["x", "y"], ma.masked_where(x%5>3, x))}, coords={"x": range(3), "y":
     ...: range(10)})
Out[138]:
<xarray.Dataset>
Dimensions:  (x: 3, y: 10)
Coordinates:
  * y        (y) int64 0 1 2 3 4 5 6 7 8 9
  * x        (x) int64 0 1 2
Data variables:
    count    (x, y) float64 0.0 1.0 2.0 3.0 nan 5.0 6.0 7.0 8.0 nan 10.0 ...
Run Code Online (Sandbox Code Playgroud)

这对我来说是不可取的,因为(1)我的数据集的内存消耗将会爆炸(它已经很大),并且(2)我的许多整数数据类型都是位字段,不能表示为浮点数。尽管int32位域可以无损地表示为 a float64,但来回比较丑陋且容易出错。

是否可以xarray.Dataset在保留整数数据类型的同时使用掩码数组?


编辑:看来问题出现在_maybe_promote. 另请参阅github 问题

sho*_*yer 6

不幸的是,xarray 不支持掩码数组或任何形式的缺少值的整数数据类型。这种选择的原因与 pandas(当前)不支持整数 NA 的原因相同,如Cavaets 和 Gotchas下的 pandas 文档所述。我们需要一个支持 NumPy 数组缺失值的整数数据类型,但遗憾的是它不存在。

我同意这对于具有缺失值的图像来说不是一个非常令人满意的解决方案,尽管在许多情况下我发现它足以使用非屏蔽整数数据,仅在算术需要时转换为浮点(并屏蔽缺失值)(例如,利用.fillna())。

关于内存使用,我建议尝试使用 xarray 和dask,它允许以流式或分布式方式执行大多数数组操作。