Интерполяция массива данных xarray для N точек и получение списка N, интерполированных с помощью dask

#python #dask #python-xarray

Вопрос:

Извините, если название не очень описательное, но я хочу следующее.

У меня есть а DataArray с координатами x , y и t . У меня также есть список N координат, и я хотел бы интерполировать, чтобы получить список N интерполированных значений. Однако я не совсем знаю, как это сделать, xarray все еще пользуясь параллелизмом dask. Вот пример со случайными значениями:

 import numpy as np
import xarray as xr

x = np.linspace(0, 1, 10)
datar = xr.DataArray(np.random.randn(10,10,10), dims=('x', 'y', 't'), coords=dict(x=x,
                                                                                  y=x,
                                                                                  t=x))
datar = datar.chunk(dict(t=1))

points = np.array([(0.1, 0.1, 0.1),
                  (0.2, 0.3, 0.3),
                  (0.6, 0.6, 0.6),
                   ])

ivals = []
for point in points:
    x0, y0, t0 = point
    interp_val = datar.interp(x=x0, y=y0, t=t0)
    ivals.append(float(interp_val))
print(ivals)
 

Это дает мне правильный результат [-1.7047738779949937, 0.9568015637947849, 0.04437392968785547] .

Есть ли какой-нибудь способ достичь того же результата, но воспользоваться преимуществами dask ?

Если я наивно передам списки интерполирующей функции, вместо этого я получу 3-кубическую матрицу:

 In [35]: x0s, y0s, t0s = points.T
    ...: print(datar.interp(x=x0s, y=y0s, t=t0s))
    ...: 
<xarray.DataArray (x: 3, y: 3, t: 3)>
dask.array<dask_aware_interpnd, shape=(3, 3, 3), dtype=float64, chunksize=(3, 3, 3), chunktype=numpy.ndarray>
Coordinates:
  * x        (x) float64 0.1 0.2 0.6
  * y        (y) float64 0.1 0.3 0.6
  * t        (t) float64 0.1 0.3 0.6
 

Ответ №1:

Немного поздно, но для того, чтобы интерполировать так, как вы хотите, и в результате не иметь куба, вы должны привести свои координаты как xarray DataArrays с вымышленным измерением points :

 import numpy as np
import xarray as xr

np.random.seed(1234)

x = np.linspace(0, 1, 10)
datar = xr.DataArray(np.random.randn(10, 10, 10), dims=('x', 'y', 't'), coords=dict(x=x, y=x,  t=x))
datar = datar.chunk(dict(t=1))

points = np.array([(0.1, 0.1, 0.1),
                  (0.2, 0.3, 0.3),
                  (0.6, 0.6, 0.6)])

x = xr.DataArray(points[:, 0], dims="points")
y = xr.DataArray(points[:, 1], dims="points")
t = xr.DataArray(points[:, 2], dims="points")

datar.interp(x=x, y=y, t=t).values
 

Это дает вам три значения, которые вы хотите. Два замечания :

  • вы должны рассчитать время выполнения двух методов, вашего цикла для и моего решения, чтобы проверить, действительно ли xarray использует преимущества нескольких точек, заданных interp ,
  • вы даете правильные значения, которые ожидаете, но они зависят от ваших случайных данных. Вы должны исправить семя раньше, чтобы привести воспроизводимые примеры 😉