map_blocks с изменением размеров возвращает IndexError: индекс кортежа вне диапазона - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь создать агрегированную статистику с массивами dask.map_blocks кажется идеальным, но не может заставить его работать.

Я новичок в dask, поэтому пытаюсь понять, как это работает.Я планирую использовать пользовательские функции и начал с некоторых основ.Я застрял и не вижу решения после нескольких часов проб и ошибок.

import dask
import dask.array as da
from numpy import median,array

def func(a):
    m = median(a)
    print(m)
    return array(m)

x = da.random.random((10000, 10000), chunks=(5000, 5000))

x.map_blocks(func,chunks=(1,1)).compute()

Я ожидал бы новый массив с результатами на блок, но получаю:

nan
0.5001597269075302
0.49996143572562185
0.49994227403711916
0.5001512434686584
Traceback (most recent call last):
  ...
    result.append(tuple([shape(deepfirst(a))[dim] for a in arrays]))
IndexError: tuple index out of range

1 Ответ

0 голосов
/ 10 июля 2019

map_blocks сначала может быть немного сложнее. Проблема здесь в том, что func возвращает массив формы (), а в map_blocks вы указываете выходные куски (1,1).

Если я вас правильно понимаю, вы хотите заменить каждый кусок x его медианой (это будут новые фрагменты размером (1,1)). Для этого вам нужно вывести массив с этой формой. Смотрите следующий код:

import dask
import dask.array as da
from numpy import median,array

def func(a):
    m = median(a)
    print(m)
    return array(m)[None,None] # add dummy dimensions

# x = da.random.random((10000, 10000), chunks=(5000, 5000))
x = da.random.random((100, 100), chunks=(50, 50)) # try things out on small array

x.map_blocks(func,chunks=(1,1)).compute()

Индексирование массива с помощью None добавляет к нему фиктивное измерение. Следовательно, array(m)[None,None] будет иметь желаемую форму (1,1).

Кроме того, для игры с этими вещами, пока они не сработают, имеет смысл работать с небольшими данными, которые я добавил в приведенном выше примере.

...