无需使用 dask dataframe 即可获取 dask 数组的唯一行

Edg*_*r H 5 python numpy dask

有没有办法获取大于可用内存的 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)
Run Code Online (Sandbox Code Playgroud)

它适用于更大的数据集,np.unique(dx, axis=0)但最终也会耗尽内存。

我使用的是 Python 3.6(但可以升级)、Dask 0.20 和 Ubuntu 18.04 LTS。

tel*_*tel 4

你总是可以使用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)
Run Code Online (Sandbox Code Playgroud)

当您尝试将其与“大于我的 RAM 的数据集”一起使用时,这可能仍然会给您带来内存问题,因为它将在单个节点上运行计算。有一个dask.array.unique函数,但还不支持axis关键字。这意味着它将展平数组并返回唯一的单个值,而不是唯一的行。允许任何类型的手动并行版本的排序功能似乎dask.array都没有实现。

我的建议是暂时忍住并转换为dask.dataframe. 这种方法可以确保您获得正确的输出,即使它不是可以想象的最快的实现。

编辑

我最初认为可能有一个简单的 hack 可用于实现 的axis参数dask.array.unique。然而,由于块的存在,用于实现其自己的关键字的blob 类型技巧numpy.unqiueaxis结果并不容易转移到 Dask 数组。

所以目前没有聪明的解决方法。只需使用dask.dataframe.