В настоящее время мой код активно использует структурированные маскированные массивы с многомерными dtypes, с десятками полей и размерами элементов во много килобайт. Похоже, что xarray
может быть отличной альтернативой, но когда я пытаюсь передать ему замаскированный массив, он меняет свой dtype для плавания:
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
, это некрасиво и чревато ошибками при переходе туда и обратно.
Можно ли использовать xarray.Dataset
с замаскированными массивами, сохраняя при этом целочисленные dtypes?
Изменить: похоже, проблема возникает в _maybe_promote
. См. также ошибку github.