2017-07-20 6 views
0

J'apprends comment utiliser le paquet python xarray, mais j'ai des problèmes avec les données multidimensionnelles. Plus précisément, comment ajouter et utiliser des coordonnées supplémentaires?Ajout et utilisation de coordonnées supplémentaires avec xarray

Voici un exemple.

import xarray as xr 
import pandas as pd 
import numpy as np 

site_id = ['brw','sum','mlo'] 
dss = [] 
for site in site_id: 
    df = pd.DataFrame(np.random.randn(20,2),columns=['a','b'],index=pd.date_range('20160101',periods=20,freq='MS')) 
    ds = df.to_xarray() 
    dss.append(ds) 

ds = xr.concat(dss, dim=pd.Index(site_id, name='site')) 
ds.coords['latitude'] = [71.323, 72.58, 19.5362] 
ds.coords['longitude'] = [156.6114, 38.48, 155.5763] 

Mon xarray jeu de données ressemble:

>>> ds 
<xarray.Dataset> 
Dimensions: (index: 20, latitude: 3, longitude: 3, site: 3) 
Coordinates: 
    * index  (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ... 
    * site  (site) object 'brw' 'sum' 'mlo' 
    * latitude (latitude) float64 71.32 72.58 19.54 
    * longitude (longitude) float64 156.6 38.48 155.6 
Data variables: 
    a   (site, index) float64 -0.1403 -0.2225 -1.199 -0.8916 0.1149 ... 
    b   (site, index) float64 -1.506 0.9106 -0.7359 2.123 -0.1987 ... 

Je peux sélectionner une série en utilisant la méthode de sel en fonction d'un code de site. Par exemple:

>>> ds.sel(site='mlo') 

Mais comment puis-je sélectionner les données en fonction des autres coordonnées (latitude ou longitude dire)?

>>> ds.sel(latitude>50) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'latitude' is not defined 

Répondre

1

Merci pour l'exemple facile à reproduire!

Vous pouvez uniquement utiliser .sel(x=y) avec =, en raison des limitations de python. Un exemple en utilisant .isel avec la latitude (sel est plus difficile, car il est un type de flotteur):

In [7]: ds.isel(latitude=0) 
Out[7]: 
<xarray.Dataset> 
Dimensions: (index: 20, longitude: 3, site: 3) 
Coordinates: 
    * index  (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ... 
    * site  (site) object 'brw' 'sum' 'mlo' 
    latitude float64 71.32 
    * longitude (longitude) float64 156.6 38.48 155.6 
Data variables: 
    a   (site, index) float64 0.6493 -0.9105 -0.9963 -0.6206 0.6856 ... 
    b   (site, index) float64 -0.03405 -1.49 0.2646 -0.3073 0.6326 ... 

Pour utiliser des conditions telles que >, vous pouvez utiliser .where:

In [9]: ds.where(ds.latitude>50, drop=True) 
Out[9]: 
<xarray.Dataset> 
Dimensions: (index: 20, latitude: 2, longitude: 3, site: 3) 
Coordinates: 
    * index  (index) datetime64[ns] 2016-01-01 2016-02-01 2016-03-01 ... 
    * site  (site) object 'brw' 'sum' 'mlo' 
    * latitude (latitude) float64 71.32 72.58 
    * longitude (longitude) float64 156.6 38.48 155.6 
Data variables: 
    a   (site, index, latitude) float64 0.6493 0.6493 -0.9105 -0.9105 ... 
    b   (site, index, latitude) float64 -0.03405 -0.03405 -1.49 -1.49 ...