2017-03-01 136 views
0

說我已經在使用xarray.open_dataset(..., decode_times=False),看起來像這樣加載一個xarray.Dataset對象打印時:子集xarray.Dataset相對於多個座標

<xarray.Dataset> 
Dimensions: (bnds: 2, lat: 15, lon: 34, plev: 8, time: 3650) 
Coordinates: 
    * time  (time) float64 3.322e+04 3.322e+04 3.322e+04 3.322e+04 ... 
    * plev  (plev) float64 1e+05 8.5e+04 7e+04 5e+04 2.5e+04 1e+04 5e+03 ... 
    * lat  (lat) float64 40.46 43.25 46.04 48.84 51.63 54.42 57.21 60.0 ... 
    * lon  (lon) float64 216.6 219.4 222.2 225.0 227.8 230.6 233.4 236.2 ... 
Dimensions without coordinates: bnds 
Data variables: 
    time_bnds (time, bnds) float64 3.322e+04 3.322e+04 3.322e+04 3.322e+04 ... 
    lat_bnds (lat, bnds) float64 39.07 41.86 41.86 44.65 44.65 47.44 47.44 ... 
    lon_bnds (lon, bnds) float64 215.2 218.0 218.0 220.8 220.8 223.6 223.6 ... 
    hus  (time, plev, lat, lon) float64 0.006508 0.007438 0.008751 ... 

什麼將是這個子集給出多個範圍爲lat的最佳方式,lontime?我試圖鏈接的一系列條件和所用xarray.Dataset.where,但我得到一個錯誤說:

IndexError: The indexing operation you are attempting to perform is not valid on netCDF4.Variable object. Try loading your data into memory first by calling .load(). 

我不能將整個數據集加載到內存中,所以這將是做到這一點的典型方式?

回答

1

NetCDF4不支持NumPy支持的所有多維索引操作。但支持切片(非常快)和一維索引(稍慢)。

有些東西嘗試:

  • 指數與切片(例如,.sel(time=slice(start, end))之前索引與1維陣列。這應該將基於數組的索引從netCDF4卸載到Dask/NumPy。
  • 將您的索引操作拆分爲更多的中間操作,這些操作可以一次索引更少的維度。這聽起來像你已經嘗試過這個,但也許值得探索一下。
  • 要優化性能,請使用.chunk()嘗試不同的Dask分塊方案。

如果這不起作用,請將完整的自包含示例發佈到GitHub上的xarray問題跟蹤器中,我們可以更詳細地查看它。

+0

感謝您的支持!我結束了使用'.sel()'(沒有意識到它可能由於某種原因需要切片)。我能看到的唯一問題是處理經度的圓柱座標。你會爲此提出什麼建議? '.sel()'之後'也許使用'.where()'子集化經度? – pbreach

+0

看到這個答案的幾個想法:http://gis.stackexchange.com/questions/205871/xarray-slicing-across-the-antimeridian – shoyer

+0

Ahhhh好吧不知道我可以用'.sel()我真的需要更好地閱讀源代碼和文檔。真是太棒了! – pbreach

相關問題