Поиск способа перебора с использованием ввода двух массивов данных xarray при их фрагментированииPython

Программы на Python
Ответить
Anonymous
 Поиск способа перебора с использованием ввода двух массивов данных xarray при их фрагментировании

Сообщение Anonymous »

Я разрабатываю относительно большую модель с использованием xarray и поэтому хочу использовать фрагменты. Большинство моих операций выполняются намного быстрее, когда они разбиты на фрагменты, но есть одна, которая работает (намного) медленнее, чем без фрагментов.
Возьмем этот массив данных в качестве примера (настоящий массив намного больше). )

Код: Выделить всё

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)
но все решения, которые я рассматривал, обрабатывают только один массив данных. В то время как в моем примере есть два массива данных, которые необходимо перебирать одновременно, включая тот факт, что для одного из массивов необходимо получить доступ к индексам idx и idx-1 (а не для других ).
Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/792 ... en-chunked
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»