Alignment

xarray enforces alignment between index Coordinates (that is, coordinates with the same name as a dimension, marked by *) on objects used in binary operations.

import xarray as xr
da = xr.open_dataarray("../data/air_temperature.nc")
da
<xarray.DataArray 'air' (time: 2920, lat: 25, lon: 53)>
[3869000 values with dtype=float32]
Coordinates:
  * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0
  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0
  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00
Attributes:
    long_name:     4xDaily Air temperature at sigma level 995
    units:         degK
    precision:     2
    GRIB_id:       11
    GRIB_name:     TMP
    var_desc:      Air temperature
    dataset:       NMC Reanalysis
    level_desc:    Surface
    statistic:     Individual Obs
    parent_stat:   Other
    actual_range:  [185.16 322.1 ]
arr = da.isel(time=0, lat=slice(5, 10), lon=slice(7, 11))
arr
<xarray.DataArray 'air' (lat: 5, lon: 4)>
array([[265.1    , 264.9    , 265.5    , 266.5    ],
       [272.9    , 272.     , 271.79   , 271.1    ],
       [279.4    , 278.9    , 278.4    , 276.6    ],
       [279.5    , 279.9    , 280.5    , 279.9    ],
       [280.1    , 280.19998, 280.79   , 281.4    ]], dtype=float32)
Coordinates:
  * lat      (lat) float32 62.5 60.0 57.5 55.0 52.5
  * lon      (lon) float32 217.5 220.0 222.5 225.0
    time     datetime64[ns] 2013-01-01
Attributes:
    long_name:     4xDaily Air temperature at sigma level 995
    units:         degK
    precision:     2
    GRIB_id:       11
    GRIB_name:     TMP
    var_desc:      Air temperature
    dataset:       NMC Reanalysis
    level_desc:    Surface
    statistic:     Individual Obs
    parent_stat:   Other
    actual_range:  [185.16 322.1 ]
part = arr[:-1]
part
<xarray.DataArray 'air' (lat: 4, lon: 4)>
array([[265.1 , 264.9 , 265.5 , 266.5 ],
       [272.9 , 272.  , 271.79, 271.1 ],
       [279.4 , 278.9 , 278.4 , 276.6 ],
       [279.5 , 279.9 , 280.5 , 279.9 ]], dtype=float32)
Coordinates:
  * lat      (lat) float32 62.5 60.0 57.5 55.0
  * lon      (lon) float32 217.5 220.0 222.5 225.0
    time     datetime64[ns] 2013-01-01
Attributes:
    long_name:     4xDaily Air temperature at sigma level 995
    units:         degK
    precision:     2
    GRIB_id:       11
    GRIB_name:     TMP
    var_desc:      Air temperature
    dataset:       NMC Reanalysis
    level_desc:    Surface
    statistic:     Individual Obs
    parent_stat:   Other
    actual_range:  [185.16 322.1 ]
  • Default behavior is an inner join
(arr + part) / 2
<xarray.DataArray 'air' (lat: 4, lon: 4)>
array([[265.1 , 264.9 , 265.5 , 266.5 ],
       [272.9 , 272.  , 271.79, 271.1 ],
       [279.4 , 278.9 , 278.4 , 276.6 ],
       [279.5 , 279.9 , 280.5 , 279.9 ]], dtype=float32)
Coordinates:
  * lat      (lat) float64 62.5 60.0 57.5 55.0
  * lon      (lon) float32 217.5 220.0 222.5 225.0
    time     datetime64[ns] 2013-01-01
  • We can also use an outer join
with xr.set_options(arithmetic_join="outer"):
    print((arr + part) / 2)
<xarray.DataArray 'air' (lat: 5, lon: 4)>
array([[   nan,    nan,    nan,    nan],
       [279.5 , 279.9 , 280.5 , 279.9 ],
       [279.4 , 278.9 , 278.4 , 276.6 ],
       [272.9 , 272.  , 271.79, 271.1 ],
       [265.1 , 264.9 , 265.5 , 266.5 ]], dtype=float32)
Coordinates:
  * lat      (lat) float64 52.5 55.0 57.5 60.0 62.5
  * lon      (lon) float32 217.5 220.0 222.5 225.0
    time     datetime64[ns] 2013-01-01

NOTE:

Notice that missing values (nan) were inserted where it is appropriate.


%load_ext watermark
%watermark --iversion -g -m -v -u -d
xarray 0.12.1
last updated: 2019-05-17 

CPython 3.6.7
IPython 7.5.0

compiler   : GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)
system     : Darwin
release    : 18.2.0
machine    : x86_64
processor  : i386
CPU cores  : 8
interpreter: 64bit
Git hash   : 83530e805423a8f36958a61783cbbd9fe388eace