Возьмем этот массив данных в качестве примера (настоящий массив намного больше). )
Код: Выделить всё
import xarray as xr
import numpy as np
da = xr.DataArray(
np.random.randint(5, size=(10, 100, 100)),
coords=[range(10), range(100), range(100)],
dims=["time", "x", "y"],
).chunk(chunks={"x":10, "y":10}) # comment this to opt out of chunking
def sum_storage(arr):
arr_new = xr.zeros_like(arr)
for idx in range(1,len(arr)):
arr_new[dict(time=idx)] = arr_new[dict(time=idx-1)] + da[dict(time=idx)]
return arr_new
%time arr_storage = sum_storage(da)
Без фрагментов: время ЦП: всего: 0 нс
Чанкировано: время ЦП: всего: 6,72 с
Я попробовал .rolling и .np_apply_along_axis, следуя другим предложениям (например, https://github.com/pydata/xarray/discussions/6247) и применив ufunc в массиве dask (https://tutorial.xarray.dev/advanced/ap ... ufunc.html). Я также вызывал функцию, используя xr.concat, например:
Код: Выделить всё
xr.concat([my_function(da[dict(time=i)]) for i in my_list], dim=da.time)
Есть предложения?
Подробнее здесь: https://stackoverflow.com/questions/792 ... en-chunked
Мобильная версия