python-xarray: изменение dtypes при слиянии

Я объединяю два набора данных по оси (в моем случае sample_ID). Однако кажется, что dtype для баз данных преобразуется из int64 в float64, даже если переменная dtype была int64 как для первой, так и для второй базы данных. Моя первая база данных (existing) выглядит так:

<xarray.Dataset>
Dimensions:          (sample_ID: 3)
Coordinates:
  * sample_ID  (sample_ID) int64 0 1 2
Data variables:
    a                (sample_ID) float64 1.0 2.0 1.1
    b                (sample_ID) float64 5.0 6.0 5.1
    varsUpdate       (sample_ID) int64 0 0 1
    y                (sample_ID) float64 100.0 200.0 100.1
    x                (sample_ID) float64 10.0 20.0 10.1
    trajID           (sample_ID) int64 1 2 1

Вторая база данных (new) выглядит так:

<xarray.Dataset>
Dimensions:          (sample_ID: 1)
Coordinates:
  * sample_ID  (sample_ID) int64 3
Data variables:
    a                (sample_ID) float64 2.1
    b                (sample_ID) float64 6.1
    varsUpdate       (sample_ID) int64 1
    y                (sample_ID) float64 200.1
    x                (sample_ID) float64 20.1
    trajID           (sample_ID) int64 2

Конечным результатом после вызова existing.merge(new,inplace=True) является

<xarray.Dataset>
Dimensions:          (sample_ID: 4)
Coordinates:
  * sample_ID  (sample_ID) int64 0 1 2 3
Data variables:
    a                (sample_ID) float64 1.0 2.0 1.1 2.1
    b                (sample_ID) float64 5.0 6.0 5.1 6.1
    varsUpdate       (sample_ID) float64 0.0 0.0 1.0 1.0
    y                (sample_ID) float64 100.0 200.0 100.1 200.1
    x                (sample_ID) float64 10.0 20.0 10.1 20.1
    trajID           (sample_ID) float64 1.0 2.0 1.0 2.0

Вы можете видеть, что все типы были преобразованы в float64. Есть ли эффективный способ поддерживать целочисленные типы?


person stochasm    schedule 13.12.2017    source источник


Ответы (1)


xarray.merge(...) объединяет наборы данных в два этапа:

  1. Он вызывает xarray.align(..., join='outer') для наборов данных, чтобы выровнять их координаты. Это вводит NaN, поэтому нам нужно продвигать int64 -> float64.
  2. Он создает объединенный набор данных как единственное значение, отличное от NaN, из выровненных наборов данных в каждой позиции массива.

Из-за того, как это работает, введение NaN, когда аргументы еще не выровнены, практически неизбежно.

Лучший способ присоединиться к вашим наборам данных — xarray.concat(..., dim='sample_ID'). Это не попытка сделать что-то умное для выравнивания по конкатенированному измерению (в данном случае 'sample_ID'), что означает, что это намного быстрее и сохраняет целочисленные dtypes.

person shoyer    schedule 13.12.2017