У меня есть этот образец данных, содержащий температуру воздуха во всем мире, и, что более важно, маску land
, обозначающую земельные/неводные районы.Получить координаты значений non-nan xarray Dataset
<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()
dry_areas
выглядит следующим образом
<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
дает мне ограничительную рамку, и я не могу получить lat и lon в форму (55, 143)
, чтобы применить маску.
Единственное рабочее обходное решение, которое я мог найти, это dry_areas.to_dataframe().dropna().reset_index()[['lat', 'lon']].values
, который не чувствует себя очень скудным и чистым.
Я чувствую, что это довольно просто, однако я, очевидно, не является numpy/matrix ninja.
Лучшее решение до сих пор
Это самый короткий я мог бы прийти с до сих пор:
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)
Спасибо! Все еще немного сложнее. Разве это не должно быть стандартным вариантом использования? – TomTom101
Tbh Я думаю, что это примерно так же сложно, как и должно быть. Но не с большой уверенностью и PR всегда приветствуются! – Maximilian
Правильно, так как это действительно сводится только к двум строкам: da_stacked = dry_areas.airt.stack (notnull = ['lat', 'lon']) da_stacked [da_stacked.notnull()] – TomTom101