Как обновить форму, фрагменты и метаданные размера массива dask с наноразмерами - PullRequest
0 голосов
/ 28 февраля 2019

Предположим, я сгенерирую массив с формой, которая зависит от некоторых вычислений, таких как:

>>> import dask.array as da
>>> a = da.random.normal(size=(int(1e6), 10))
>>> a = a[a.mean(axis=1) > 0]
>>> a.shape
(nan, 10)
>>> a.chunks
((nan, nan, nan, nan, nan), (10,))
>>> a.chunksize
(nan, 10)

Ожидается nan.Когда я сохраняю результат вычислений для рабочих, работающих в режиме dask, я предполагаю, что эти недостающие метаданные могли быть получены, но, по-видимому, это не так:

>>> a_persisted = a.persist()
>>> a_persisted.chunks
((nan, nan, nan, nan, nan), (10,))
>>> a_persisted.chunksize
(nan, 10)
>>> a_persisted.shape
(nan, 10)

Если я попытаюсь вызвать повторную проверку, я получу:

>>> a_persisted.rechunk("auto")
Traceback (most recent call last):
  File "<ipython-input-26-31162de022a0>", line 1, in <module>
    a_persisted.rechunk("auto")
  File "/home/ogrisel/code/dask/dask/array/core.py", line 1647, in rechunk
    return rechunk(self, chunks, threshold, block_size_limit)
  File "/home/ogrisel/code/dask/dask/array/rechunk.py", line 226, in rechunk
    dtype=x.dtype, previous_chunks=x.chunks)
  File "/home/ogrisel/code/dask/dask/array/core.py", line 1872, in normalize_chunks
    chunks = auto_chunks(chunks, shape, limit, dtype, previous_chunks)
  File "/home/ogrisel/code/dask/dask/array/core.py", line 1949, in auto_chunks
    raise ValueError("Can not perform automatic rechunking with unknown "
ValueError: Can not perform automatic rechunking with unknown (nan) chunk sizes

Какой идиоматический способ обновить метаданные моего массива с помощью фактического размера фрагментов, которые уже были вычислены на рабочем месте?

Я могу вычислить их очень дешевос:

>>> dask.compute([chunk.shape for chunk in a_persisted.to_delayed().ravel()])
([(100108, 10), (99944, 10), (99545, 10), (99826, 10), (100099, 10)],)

Мой вопрос заключается в том, как получить новый массив dask, подкрепленный теми же кусками, с некоторыми информативными атрибутами .shape, .chunk и .chunksize (без nans).

>>> dask.__version__
'1.1.0+9.gb1fef05'

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Похоже, что это скоро будет решено внутренне в массиве dask (https://github.com/dask/dask/issues/3293). До тех пор, вот обходной путь, который я использую:

import dask.array as da
import dask.dataframe as dd
a = da.random.normal(size=(int(1e6), 10))
a = dd.from_dask_array(a[a.mean(axis=1) >0],columns=np.arange(a.shape[1])).to_dask_array(lengths=True).persist()
print(a.chunks)
print(a.shape)

((100068, 100157, 100279, 100446, 99706), (10,))
(500656, 10)
0 голосов
/ 06 марта 2019

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

Редактировать: это отслеживается здесь: https://github.com/dask/dask/issues/3293

...