[英]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'].values
和volc['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
坐標, latitude
和longitude
坐標(和維度)變得過時,我需要重新組織變量的維度。 我以為我可以簡單地使用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.