#python #dask #python-xarray #dask-distributed #scientific-computing
#python #dask #python-xarray #dask-распределенный #научные вычисления
Вопрос:
Я пытаюсь применить простую операцию параллельно к кубу данных, но я продолжаю сталкиваться с TypeError
.
Это мой входной куб данных (вызывается dcube
):
<xarray.DataArray 'A' (time: 6, pol: 1, y: 823, x: 1296)>
dask.array<where, shape=(6, 1, 823, 1296), dtype=float64, chunksize=(6, 1, 823, 1000), chunktype=numpy.ndarray>
Coordinates:
* pol (pol) object 'HH'
* y (y) float64 3.653e 06 3.653e 06 3.653e 06 ... 3.652e 06 3.652e 06
* x (x) float64 1.047e 06 1.047e 06 1.047e 06 ... 1.049e 06 1.049e 06
* time (time) datetime64[ns] 2020-11-05T06:44:35 ... 2020-12-08T16:42:42
id (time) <U51 dask.array<chunksize=(6,), meta=np.ndarray>
Attributes:
orbit: A
transform: (1.1987408006010196, 0.0, 1047472.9120438152, 0.0, -1.198740...
crs: {'proj': 'utm', 'zone': 10, 'datum': 'WGS84', 'units': 'm', ...
Функция, которую я пытаюсь вычислить, выглядит следующим образом:
def compute_something(chunk):
img1 = chunk[0] 0.00001
img2 = chunk[1] 0.00001
return da.log10(img1 / img2)
Когда я пытаюсь запустить:
da.map_blocks(compute_something, dcube, dtype=np.float32).compute()
Это ошибка, которую я вижу:
/usr/local/lib/python3.7/site-packages/tornado/gen.py in run(self)
760
761 try:
--> 762 value = future.result()
763 except Exception:
764 exc_info = sys.exc_info()
/usr/local/lib/python3.7/site-packages/distributed/client.py in _gather(self, futures, errors, direct, local_worker)
1848 exc = CancelledError(key)
1849 else:
-> 1850 raise exception.with_traceback(traceback)
1851 raise exc
1852 if errors == "skip":
TypeError: tuple indices must be integers or slices, not tuple
Похоже, ничто в трассировке не указывает, что это за ошибка.
Чтобы немного лучше понять проблему, я создал этот минимальный пример:
arr = da.from_array(xa.DataArray([np.random.random((200,200))]),(1,10,10))
Затем я пытаюсь выполнить эту простую функцию:
def fn(x):
return x
Когда я пытаюсь распространять с map_blocks
помощью, я получаю ошибку утверждения:
AA = da.map_blocks(fn, arr).compute()
/usr/local/lib/python3.7/site-packages/dask/array/core.py in new_da_object(dsk, name, chunks, meta, dtype)
5017 from ..dataframe.core import new_dd_object
5018
-> 5019 assert all(len(c) == 1 for c in chunks[1:])
5020 divisions = [None] * (len(chunks[0]) 1)
5021 return new_dd_object(dsk, name, meta, divisions)
AssertionError:
Это наводит меня на мысль, что, возможно, мое понимание того, как map_blocks
работает, отсутствует. Любая помощь будет оценена.
Обновить / Редактировать:
После небольшого исследования я обнаружил, что если тип блока ndarray
равен, все работает отлично, но если тип блока xarray
равен, это не так. Не уверен, почему это так, как можно преобразовать; но если я инициализирую arr
как:
arr = da.from_array(np.random.random((200,200)))
map_blocks
работает отлично. Но если он содержит xarray
, это не так