0
我有這個樣本數據集包含全球氣溫,更重要的是,一個面具land
,標誌着陸地/非水域。獲取xarray的非nan值的座標數據集數據集
<xarray.Dataset>
Dimensions: (lat: 55, lon: 143, time: 5)
Coordinates:
* time (time) datetime64[ns] 2016-01-01 2016-01-02 2016-01-03 ...
* lat (lat) float64 -52.5 -50.0 -47.5 -45.0 -42.5 -40.0 -37.5 -35.0 ...
* lon (lon) float64 -177.5 -175.0 -172.5 -170.0 -167.5 -165.0 -162.5 ...
land (lat, lon) bool False False False False False False False False ...
Data variables:
airt (time, lat, lon) float64 7.952 7.61 7.389 7.267 7.124 6.989 ...
我現在可以掩蓋海洋和繪製它
dry_areas = ds.where(ds.land)
dry_areas.airt.plot()
<xarray.Dataset>
Dimensions: (lat: 55, lon: 143)
Coordinates:
* lat (lat) float64 -52.5 -50.0 -47.5 -45.0 -42.5 -40.0 -37.5 -35.0 ...
* lon (lon) float64 -177.5 -175.0 -172.5 -170.0 -167.5 -165.0 -162.5 ...
land (lat, lon) bool False False False False False False False False ...
Data variables:
airt (lat, lon) float64 nan nan nan nan nan nan nan nan nan nan nan ...
我怎麼能現在得到的座標爲所有非NaN值?
dry_areas.coords
給我的邊界框,我不能得到緯度和經度到(55, 143)
形狀,所以我可以應用面具。
我能找到的唯一的工作解決方法是 dry_areas.to_dataframe().dropna().reset_index()[['lat', 'lon']].values
,它感覺不太乾淨。
我覺得這很簡單,但我顯然不是一個numpy /矩陣忍者。
最好的解決方案至今
這是我能來這麼遠的最短:
lon, lat = np.meshgrid(ds.coords['lon'], ds.coords['lat'])
lat_masked = ma.array(lat, mask=dry_areas.airt.fillna(False))
lon_masked = ma.array(lon, mask=dry_areas.airt.fillna(False))
land_coordinates = zip(lat_masked[lat_masked.mask].data, lon_masked[lon_masked.mask].data)
謝謝!仍然有點複雜imo。這不應該是一個標準的用例嗎? – TomTom101
Tbh我認爲這應該是簡單的。但沒有太多的信心,公關總是歡迎! – Maximilian
你是對的,因爲這實際上歸結爲只有2行:da_stacked = dry_areas.airt.stack(notnull = ['lat','lon']) da_stacked [da_stacked.notnull()] – TomTom101