xarray如何在保留整数数据类型的情况下使用掩码数组?

8

目前,我的代码使用了大量多维dtype的结构化掩码数组,其中有数十个字段和许多千字节的项目大小。看起来xarray可能是一个很好的替代方案,但当我尝试传递一个掩码数组时,它会将其dtype更改为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 ...

这对我来说是不理想的,因为(1)我的数据集的内存消耗会急剧增加(它已经很大了),而且(2)我的许多整数类型是位字段,不能表示为浮点数。虽然 int32 位域可以无损地表示为 float64,但来回转换很麻烦且容易出错。

是否可能在保留整数 dtypes 的同时使用带掩码数组的 xarray.Dataset


编辑:看起来问题发生在 _maybe_promote。另请参见 github 问题


参见:https://dev59.com/1Ggu5IYBdhLWcg3wJDybhttp://www.numpy.org/NA-overview.html - gerrit
1个回答

6
很遗憾,xarray不支持掩码数组或任何形式的带缺失值的整数dtype。这种选择的原因与pandas不支持整数NA(当前)相同,如pandas文档中所述Cavaets and Gotchas。我们需要一种支持NumPy数组中缺失值的整数dtype,但很遗憾这种类型不存在。我同意这对于有缺失值的图像来说不是一个非常令人满意的解决方案,但在许多情况下,我发现使用非掩码整数数据进行操作就足够了,只有在必要进行算术运算(例如利用.fillna())时才将其转换为浮点型(并掩盖缺失值)。关于内存使用方面,建议尝试使用dask与xarray配合使用,它可以以流式或分布式方式执行大多数数组操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接