带有屏蔽数组的xarray,同时保留整数dtypes
作者:互联网
当前,我的代码大量使用具有多维dtypes的结构化蒙版数组,该数组具有数十个字段和数个千字节大小的项目.看来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)我的许多integer-dtypes都是位字段,不能将其表示为浮点数.尽管可以将int32位字段无损地表示为float64,但来回移动是丑陋且容易出错的.
是否可以在保留整数dtypes的同时将xarray.Dataset与掩码数组一起使用?
编辑:看来问题发生在_maybe_promote
.另请参见github issue.
解决方法:
不幸的是,xarray不支持掩码数组或缺少值的任何形式的整数dtype.进行此选择的原因与0700年熊猫文档中描述的为什么熊猫不(当前)支持整数NA的原因相同.我们需要一个整数dtype,它支持NumPy数组的缺失值,但不幸的是不存在.
我同意,对于缺少值的图像,这不是一个令人满意的解决方案,尽管在很多情况下,我发现使用非掩码整数数据,仅在进行算术运算时才转换为浮点(并掩码缺失值)就足够了例如,使用.fillna().
关于内存使用,我建议尝试将xarray与dask一起使用,该功能允许以流式或分布式方式执行大多数阵列操作.
标签:python-xarray,python,masked-array 来源: https://codeday.me/bug/20191111/2022928.html