интерполяция точек xarray на нескольких измерениях - PullRequest
2 голосов
/ 15 мая 2019

Я пытаюсь интерполировать информацию из 3D-набора данных (долгота, широта, время), используя непосредственно xarray.

Когда я сделал простую интерполяцию только с одной точкой, у меня не было никаких проблем.

lat = [44.25]
lon = [-4.5]
t = datetime.strptime('2000-02-28 01:00:00', '%Y-%m-%d %H:%M:%S')

ds = xr.open_dataset('file.nc')
vx = ds['uo_surface'].interp(longitude=lon, latitude=lat, time=t)

Но теперь я пытаюсь таким же образом интерполировать несколько точек, и результат этой операции, следуя тому же синтаксису, показывает больше результатов, чем я ожидал.

lat = [44.25, 45.25]
lon = [-4.5, -5]
t = datetime.strptime('2000-02-28 01:00:00', '%Y-%m-%d %H:%M:%S')

ds = xr.open_dataset('Currents\oceanTESEO.nc')
vx = ds['uo_surface'].interp(longitude=lon, latitude=lat, time=[t, t])

Результатом является этот массив:

array([[[0.01750018, 0.05349977],
        [0.03699994, 0.11299999]],

       [[0.01750018, 0.05349977],
        [0.03699994, 0.11299999]]])

Однако я ожидаю только 2 значения, по одному для каждой (lon, lat, t) точки.Должен ли я реализовать цикл, чтобы сделать это?Я полагаю, что эта функция уже включена в xarray.Знаете ли вы другой способ для более точного вычисления этого типа точечной интерполяции с использованием четырехмерных datarrays (lon, lat, z, time)?

Заранее спасибо !!!

1 Ответ

1 голос
/ 15 мая 2019

Да, это возможно.

С первого взгляда это немного "менее интуитивно", но мощно и задокументировано здесь: http://xarray.pydata.org/en/stable/interpolation.html#advanced-interpolation

Вы должны сделать следующий вызов:

ds['uo_surface'].interp(longitude=('z', lon), latitude=('z', lat), 
                        time=('z', [t, t]))

Это реализует «векторизованную» индексацию, в то время как во время предыдущего вызова вы выполняли «ортогональную» индексацию.Для получения дополнительной информации см http://xarray.pydata.org/en/stable/indexing.html#vectorized-indexing

...