Получить уникальные строки массива dask без использования dask dataframe - PullRequest
0 голосов
/ 20 ноября 2018

Есть ли способ получить уникальные строки массива dask, который больше доступной памяти?В идеале, без преобразования в dask DataFrame?

В настоящее время я использую этот подход

import dask.array as da
import dask.dataframe as dd

dx = da.random.random((10000, 10000), chunks=(1000, 1000))
ddf = dd.from_dask_array(dx)
ddf = ddf.drop_duplicates()
dx = ddf.to_dask_array(lengths=True)

, который работает для больших наборов данных, чем np.unique(dx, axis=0), но в конечном итоге также исчерпываетобъем памяти.

Я использую Python 3.6 (но могу обновить), Dask 0.20 и Ubuntu 18.04 LTS.

1 Ответ

0 голосов
/ 20 ноября 2018

Вы всегда можете просто использовать numpy.unique:

import dask.array as da
import numpy as np

dx = da.random.random((10000, 10000), chunks=(1000, 1000))
dx = np.unique(dx, axis=0)

Это может по-прежнему вызывать проблемы с памятью, когда вы пытаетесь использовать его с «наборами данных, превышающими мою оперативную память», поскольку он будет выполнять вычисления на одном узле.Существует функция dask.array.unique, но она пока не поддерживает ключевое слово axis.Это означает, что он сгладит массив и вернет уникальные отдельные значения, а не уникальные строки.Кажется, что функции сортировки, которые допускали бы любой вид свернутой вручную параллельной версии, также не реализованы в dask.array.

Я бы порекомендовал просто смириться с этим и преобразовать в dask.dataframe.Этот подход гарантирует, что вы получите правильный вывод, даже если это не самая быстрая реализация.

Edit

Сначала я подумал, что может быть простой взлом, который можно использовать для реализации axis параметр для dask.array.unique.Однако трюк типа , который numpy.unqiue использует для реализации своего собственного ключевого слова axis , оказывается непростым переносом в массивы Dask из-за наличия фрагментов.

пока без умного гадания.Просто используйте dask.dataframe.

...