Python 带掩码数组的xarray,同时保留整数数据类型

Python 带掩码数组的xarray,同时保留整数数据类型,python,python-xarray,masked-array,Python,Python Xarray,Masked Array,目前,我的代码大量使用具有多维数据类型的结构化屏蔽数组,其中包含数十个字段,项大小为数千字节。看起来这可能是一个很好的选择,但当我尝试向它传递一个屏蔽数组时,它会将其数据类型更改为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), "

目前,我的代码大量使用具有多维数据类型的结构化屏蔽数组,其中包含数十个字段,项大小为数千字节。看起来这可能是一个很好的选择,但当我尝试向它传递一个屏蔽数组时,它会将其数据类型更改为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 ...
[137]中的
:x=arange(30,dtype=“i1”)。重塑(3,10)
在[138]:xr.Dataset({“count”:([“x”,“y”],ma.masked_其中(x%5>3,x))}中,坐标={“x”:范围(3),“y”:
…:范围(10)})
出[138]:
尺寸:(x:3,y:10)
协调:
*y(y)int64 01 2 3 4 5 6 7 8 9
*x(x)int64 0 1 2
数据变量:
计数(x,y)浮点64 0.0 1.0 2.0 3.0 nan 5.0 6.0 7.0 8.0 nan 10.0。。。
这对我来说是不可取的,因为(1)我的数据集的内存消耗将爆炸式增长(它已经很大了),(2)我的许多整数数据类型都是位字段,不能用浮点表示。虽然
int32
位字段可以无损地表示为
float64
,但它很难看,而且容易来回出错

在保留整数数据类型的同时,是否可以对屏蔽数组使用
xarray.Dataset



编辑:问题似乎发生在。另请参见。

不幸的是,xarray不支持掩码数组或任何形式的缺少值的整数数据类型。选择此选项的原因与pandas(目前)不支持整数NAs的原因相同,如下面的pandas文档所述。我们需要一个整型数据类型来支持NumPy数组缺少的值,不幸的是,它不存在

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

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

另请参见:和。