У меня есть xr.Dataset
данных, которые являются измерениями из атмосферы, по которым я хочу интегрировать.Данные имеют размеры широту и высоту.Высота имеет единицу измерения.Для этого примера я заполнил xr.DataArray
единицами и нан.Я хочу интегрировать от нижней границы, в данном случае «снизу», где высота = 0, до значений высоты, указанных в границе.Граничное значение также выражено в метрах и отличается для каждой широты.
data = xr.DataArray(np.ones((5, 5)),[
('latitude', ['a', 'b', 'c', 'd', 'e']),
('altitude', [0, 100, 200, 300, 400])])
data[2][0] = np.nan
data['boundary'] = ('latitude', [200, 300, 500, 300, 100])
Чтобы получить интересующие меня значения, мой подход
arr = data.where(data.altitude < data.boundary)
Результат этой операции следующий:
<xarray.DataArray (latitude: 5, altitude: 5)>
array([[ 1., 1., nan, nan, nan],
[ 1., 1., 1., nan, nan],
[nan, 1., 1., 1., 1.],
[ 1., 1., 1., nan, nan],
[ 1., nan, nan, nan, nan]])
Coordinates:
* latitude (latitude) <U1 'a' 'b' 'c' 'd' 'e'
* altitude (altitude) int64 0 100 200 300 400
boundary (latitude) int64 200 300 500 300 100
Я хочу интегрировать свои данные по высоте, используя numpy.trapz, результат должен быть следующим.
<xarray.DataArray (latitude: 5)>
array([100, 200, 300, 200, 0])
Coordinates:
* latitude (latitude) <U1 'a' 'b' 'c' 'd' 'e'
boundary (latitude) int64 200 300 500 300 100
Функция numpy.trapz не принимает значения nan, поэтомуЯ должен отфильтровать свои данные перед применением интеграции и отбросить все nans.Я мог бы сделать это, используя цикл for:
integration = []
for lat in latitudes:
a = arr.sel(latitude = lat).dropna(dim = "altitude")
integration.append(np.trapz(a, a.altitude))
Или мое решение прямо сейчас, потому что в моих данных также есть измерение времени, которое имеет разные границы, это подход GroupBy.
def integration(ds):
ds = ds.dropna(dim = "altitude")
ds['integrated'] = np.trapz(ds, ds.altitude)
return ds.integrated
integration = arr.groupby('latitude').apply(integration)
Различные границы, с которыми я работаю, это, например, тропопауза и стратопауза.Когда я анализирую тропосферу, я делаю интеграцию от земли до тропопаузы.Для стратосферы я делаю интеграцию от тропопаузы до стратопаузы.
Но с "циклами for" или "циклами GroupBy" мои вычисления занимают много времени, потому что у меня много данных для анализа.Поэтому я ищу элегантное решение xarray, где мне не нужно использовать слишком много циклов или групповых файлов.Нижняя граница и верхняя граница различны для каждой широты в каждом временном измерении и для каждого слоя.Я хочу предоставить numpy.trapz значения, которые ему нужны, без nans в границах высоты.