Предположим, я сгенерирую массив с формой, которая зависит от некоторых вычислений, таких как:
>>> 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'