Python 带掩码数组的xarray,同时保留整数数据类型
目前,我的代码大量使用具有多维数据类型的结构化屏蔽数组,其中包含数十个字段,项大小为数千字节。看起来这可能是一个很好的选择,但当我尝试向它传递一个屏蔽数组时,它会将其数据类型更改为float: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), "
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,它允许以流式或分布式方式执行大多数阵列操作。另请参见:和。