Интеграция с переменными границами массива со значениями nan - PullRequest
0 голосов
/ 23 октября 2018

У меня есть 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 в границах высоты.

...