Как работает разбиение массива dask на три или более измерения? - PullRequest
1 голос
/ 15 февраля 2020

Рассмотрим следующий фрагмент кода, в котором я пытаюсь создать массив dask с асимметрией c, но повторяющимися блоками размером (3, 4, 5):

import numpy as np
import dask.array as da
a = np.random.randint(0, 9, (3, 12, 10))
d = da.from_array(a, chunks=(3, 4, 5))

Приведенный выше фрагмент не вызывает никаких ошибок / предупреждений. , Но когда я пытаюсь сделать следующее:

r = d.map_blocks(np.sum)
out = r.compute()

выдает ошибку ниже:

python3.7/site-packages/dask/array/core.py in <listcomp>(.0)
   4099 
   4100     while isinstance(arrays, (list, tuple)):
-> 4101         result.append(tuple([shape(deepfirst(a))[dim] for a in arrays]))
   4102         arrays = arrays[0]
   4103         dim += 1

IndexError: tuple index out of range

Что я делаю не так?

1 Ответ

2 голосов
/ 15 февраля 2020

Если вы отметите map_block документы здесь . В описании параметра chunks указано:

"Если не указано, предполагается, что результирующий массив будет иметь ту же блочную структуру, что и первый входной массив."

Итак, ваша sum функция должно быть что-то вроде этого:

def compute_block_sum(block):
    return np.array([[np.sum(block)]])[:,None]

Тогда вы делаете

d.map_blocks(compute_block_sum).compute()
...