簡體   English   中英

如何更改 xarray 變量的維度?

[英]How can I change the dimensions of a xarray variable?

我有一個網格化的 xarray 數據集,如下所示:

print(ds)
<xarray.Dataset>
Dimensions:        (month: 12, isobaricInhPa: 37, latitude: 721, longitude: 1440)
Coordinates:
  * isobaricInhPa  (isobaricInhPa) float64 1e+03 975.0 950.0 ... 3.0 2.0 1.0
  * latitude       (latitude) float64 90.0 89.75 89.5 ... -89.5 -89.75 -90.0
  * longitude      (longitude) float64 0.0 0.25 0.5 0.75 ... 359.2 359.5 359.8
  * month          (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
Data variables:
    h              (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 405, 720), meta=np.ndarray>
    speed          (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 405, 720), meta=np.ndarray>
    direction      (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 405, 720), meta=np.ndarray>

從這個數據集中,我使用以下方法提取了一系列點的數據:

ds_volc = ds.sel(latitude=volc['Latitude'].values,longitude=volc['Longitude'].values, method='nearest', drop=True)

其中volc是 Pandas DataFrame, volc['Latitude'].valuesvolc['Longitude'].values是我的 1431 個興趣點的緯度/經度對向量。

print(ds_volc)
<xarray.Dataset>
Dimensions:        (month: 12, isobaricInhPa: 37, latitude: 1431, longitude: 1431)
Coordinates:
  * isobaricInhPa  (isobaricInhPa) float64 1e+03 975.0 950.0 ... 3.0 2.0 1.0
  * latitude       (latitude) float64 50.25 45.75 42.25 ... -56.0 -64.25 -62.0
  * longitude      (longitude) float64 6.75 3.0 2.5 0.0 ... 0.0 0.0 0.0 0.0
  * month          (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
Data variables:
    h              (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 190, 1431), meta=np.ndarray>
    speed          (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 190, 1431), meta=np.ndarray>
    direction      (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 190, 1431), meta=np.ndarray>

我不需要使用成對的緯度/經度坐標,而是需要添加點的ID (稱為Volcano Number )作為新坐標:

ds_volc = ds_volc.assign_coords({'Volcano Number':volc['Volcano Number'].values})   

結果是:

<xarray.Dataset>
Dimensions:         (month: 12, isobaricInhPa: 37, latitude: 1431, longitude: 1431, Volcano Number: 1431)
Coordinates:
  * isobaricInhPa   (isobaricInhPa) float64 1e+03 975.0 950.0 ... 3.0 2.0 1.0
  * latitude        (latitude) float64 50.25 45.75 42.25 ... -56.0 -64.25 -62.0
  * longitude       (longitude) float64 6.75 3.0 2.5 0.0 ... 0.0 0.0 0.0 0.0
  * month           (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
  * Volcano Number  (Volcano Number) int64 210010 210020 ... 390829 390847
Data variables:
    h               (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 190, 1431), meta=np.ndarray>
    speed           (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 190, 1431), meta=np.ndarray>
    direction       (month, isobaricInhPa, latitude, longitude) float32 dask.array<chunksize=(1, 19, 190, 1431), meta=np.ndarray>

問題

由於我添加了Volcano Number坐標, latitudelongitude坐標(和維度)變得過時,我需要重新組織變量的維度。 我以為我可以簡單地使用ds_volc.drop_dims(['latitude', 'longitude']) ,但這會刪除相關變量。 我也嘗試過ds_volc.sel({'Volcano Number': 210010}, drop=True) ,但是它返回了一個 xarray.Dataset,它有 1431 個經度和 1431 個緯度點。

因此,有沒有辦法以某種方式重塑變量,使它們的維度變為(month: 12, isobaricInhPa: 37, Volcano Number: 1431)而不是(month, isobaricInhPa, latitude, longitude) ,以便返回 xarray.Dataset 的當我使用ds_volc.sel({'Volcano Number': 210010}, drop=True)查詢時維度(month: 12, isobaricInhPa: 37) )?

當您使用 numpy 數組或緯度/經度列表選擇數據集的子集時,您可以獨立地在多個維度中對數據進行子集化。 換句話說,您正在選擇每個緯度與所有經度的所有組合 - 結果仍然是一張世界地圖,但每個火山坐標都有垂直和水平數據帶。 這就是為什么您在緯度經度維度上都有 1,431 個條目。

相反,使用 DataArray 索引器來利用 xarray 的高級索引

# set the column you would like as the DataFrame's index
volc = volc.set_index('Volcano Number')

# extract the data at each point, forming a new 1-D dimension 
# "Volcano Number" in place of "Latitude" and "Longitude"
ds_volc = ds.sel(
    latitude=volc['Latitude'].to_xarray(),
    longitude=volc['Longitude'].to_xarray(),
    method='nearest',
)

這將重塑數據集以符合volc DataFrame 索引的形狀。 結果將由 1,431 座火山索引,而不是 1,431 lats 和 1,431 lons。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM