_images/wavespectra_logo.png

Selecting#

Wavespectra complements xarray’s selecting and interpolating functionality with functions to select and interpolate from site (1D) coordinates. The functions are defined in wavespectra.core.select module and can be accessed via the sel method from SpecArray and SpecDset accessors.

Nearest neighbour#

Select from nearest sites.

In [1]: from wavespectra import read_ww3

In [2]: dset = read_ww3("_static/ww3file.nc")

In [3]: ds = dset.spec.sel(
   ...:     lons=[92.01, 92.05, 92.09],
   ...:     lats=[19.812, 19.875, 19.935],
   ...:     method="nearest"
   ...: )
   ...: 

In [4]: ds
Out[4]: 
<xarray.Dataset>
Dimensions:  (time: 9, site: 3, freq: 25, dir: 24)
Coordinates:
  * freq     (freq) float32 0.04118 0.0453 0.04983 ... 0.3352 0.3687 0.4056
  * time     (time) datetime64[ns] 2014-12-01 2014-12-01T12:00:00 ... 2014-12-05
  * dir      (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
  * site     (site) int64 0 1 2
Data variables:
    dpt      (time, site) float32 dask.array<chunksize=(9, 3), meta=np.ndarray>
    efth     (time, site, freq, dir) float32 dask.array<chunksize=(9, 3, 25, 24), meta=np.ndarray>
    lat      (site) float32 dask.array<chunksize=(3,), meta=np.ndarray>
    lon      (site) float32 dask.array<chunksize=(3,), meta=np.ndarray>
    wspd     (time, site) float32 dask.array<chunksize=(9, 3), meta=np.ndarray>
    wdir     (time, site) float32 dask.array<chunksize=(9, 3), meta=np.ndarray>

Inverse distance weighting#

Interpolate at exact locations via inverse distance weighting algorithm.

In [5]: ds = dset.spec.sel(
   ...:     lons=[92.01, 92.05, 92.09],
   ...:     lats=[19.812, 19.875, 19.935],
   ...:     method="idw"
   ...: )
   ...: 

In [6]: ds
Out[6]: 
<xarray.Dataset>
Dimensions:  (freq: 25, time: 9, dir: 24, site: 3)
Coordinates:
  * freq     (freq) float32 0.04118 0.0453 0.04983 ... 0.3352 0.3687 0.4056
  * time     (time) datetime64[ns] 2014-12-01 2014-12-01T12:00:00 ... 2014-12-05
  * dir      (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
  * site     (site) int64 0 1 2
Data variables:
    dpt      (time, site) float32 dask.array<chunksize=(9, 1), meta=np.ndarray>
    efth     (time, site, freq, dir) float32 dask.array<chunksize=(9, 1, 25, 24), meta=np.ndarray>
    lat      (site) float64 19.81 19.88 19.93
    lon      (site) float64 92.01 92.05 92.09
    wspd     (time, site) float32 dask.array<chunksize=(9, 1), meta=np.ndarray>
    wdir     (time, site) float32 dask.array<chunksize=(9, 1), meta=np.ndarray>

Bounding box#

Select all sites withing bounding box.

In [7]: ds = dset.spec.sel(
   ...:     lons=[91, 93],
   ...:     lats=[19, 20],
   ...:     method="bbox"
   ...: )
   ...: 

In [8]: ds
Out[8]: 
<xarray.Dataset>
Dimensions:  (time: 9, site: 2, freq: 25, dir: 24)
Coordinates:
  * freq     (freq) float32 0.04118 0.0453 0.04983 ... 0.3352 0.3687 0.4056
  * time     (time) datetime64[ns] 2014-12-01 2014-12-01T12:00:00 ... 2014-12-05
  * dir      (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
  * site     (site) int64 0 1
Data variables:
    dpt      (time, site) float32 dask.array<chunksize=(9, 2), meta=np.ndarray>
    efth     (time, site, freq, dir) float32 dask.array<chunksize=(9, 2, 25, 24), meta=np.ndarray>
    lat      (site) float32 dask.array<chunksize=(2,), meta=np.ndarray>
    lon      (site) float32 dask.array<chunksize=(2,), meta=np.ndarray>
    wspd     (time, site) float32 dask.array<chunksize=(9, 2), meta=np.ndarray>
    wdir     (time, site) float32 dask.array<chunksize=(9, 2), meta=np.ndarray>

Note

When working with large datasets with thousands of spectra sites, it is recommended using chunks={“site”: 1} option to open dataset lazily in an efficient way for selecting sites. The downside is that accessing entire site-dependent variables (notably lon and lat) becomes slower, affecting the performance of selecting functions. This can be circumvented by loading these variables without the chunks options, and using them as arguments in sel, e.g.

In [9]: coords = read_ww3("_static/ww3file.nc")[["lon", "lat"]]

In [10]: dset = read_ww3("_static/ww3file.nc", chunks={"site": 1})

In [11]: ds = dset.spec.sel(
   ....:     lons=[92.01, 92.05, 92.09],
   ....:     lats=[19.812, 19.875, 19.935],
   ....:     method="idw",
   ....:     dset_lons=coords.lon,
   ....:     dset_lats=coords.lat
   ....: )
   ....: 

In [12]: ds
Out[12]: 
<xarray.Dataset>
Dimensions:  (freq: 25, time: 9, dir: 24, site: 3)
Coordinates:
  * freq     (freq) float32 0.04118 0.0453 0.04983 ... 0.3352 0.3687 0.4056
  * time     (time) datetime64[ns] 2014-12-01 2014-12-01T12:00:00 ... 2014-12-05
  * dir      (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
  * site     (site) int64 0 1 2
Data variables:
    dpt      (time, site) float32 dask.array<chunksize=(9, 1), meta=np.ndarray>
    efth     (time, site, freq, dir) float32 dask.array<chunksize=(9, 1, 25, 24), meta=np.ndarray>
    lat      (site) float64 19.81 19.88 19.93
    lon      (site) float64 92.01 92.05 92.09
    wspd     (time, site) float32 dask.array<chunksize=(9, 1), meta=np.ndarray>
    wdir     (time, site) float32 dask.array<chunksize=(9, 1), meta=np.ndarray>