xarray с маскированными массивами при сохранении целочисленных dtypes

В настоящее время мой код активно использует структурированные маскированные массивы с многомерными 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.


person gerrit    schedule 06.01.2017    source источник
comment
См. также: stackoverflow.com/q/11548005/974555 и numpy.org/NA-overview.html.   -  person gerrit    schedule 07.01.2017


Ответы (1)


К сожалению, xarray не поддерживает маскированные массивы или любые формы целочисленных dtypes с пропущенными значениями. Причины для этого выбора те же, что и причины, по которым pandas (в настоящее время) не поддерживает целочисленные NA, как описано в документах pandas в разделе Оговорки и ошибки. Нам понадобится целочисленный dtype, поддерживающий отсутствующие значения для массивов NumPy, которого, к сожалению, не существует.

Я согласен, что это не очень удовлетворительное решение для изображений с пропущенными значениями, хотя во многих случаях я обнаружил, что достаточно либо работать с немаскированными целочисленными данными, либо конвертировать в число с плавающей запятой (и маскировать пропущенные значения) только тогда, когда это необходимо для арифметики ( например, используя .fillna()).

Что касается использования памяти, я рекомендую попробовать xarray с dask, который позволяет выполнять большинство операций с массивами в потоковом или распределенном режиме.

person shoyer    schedule 07.01.2017