
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: (dir: 24, time: 9, site: 3, freq: 25)
Coordinates:
* dir (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
* freq (freq) float32 0.04118 0.0453 0.04983 ... 0.3352 0.3687 0.4056
* site (site) int64 0 1 2
* time (time) datetime64[ns] 2014-12-01 2014-12-01T12:00:00 ... 2014-12-05
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: (dir: 24, freq: 25, time: 9, site: 3)
Coordinates:
* dir (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
* 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
* 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: (dir: 24, time: 9, site: 2, freq: 25)
Coordinates:
* dir (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
* freq (freq) float32 0.04118 0.0453 0.04983 ... 0.3352 0.3687 0.4056
* site (site) int64 0 1
* time (time) datetime64[ns] 2014-12-01 2014-12-01T12:00:00 ... 2014-12-05
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: (dir: 24, freq: 25, time: 9, site: 3)
Coordinates:
* dir (dir) float32 270.0 255.0 240.0 225.0 ... 330.0 315.0 300.0 285.0
* 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
* 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>