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

时间:2018-11-20 09:05:26

标签: python numpy 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 :(得分:3)

您始终可以只使用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)

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

我的建议是暂时将其吸纳并转换为dask.dataframe。即使不是最快的实现方式,这种方法也可以确保您获得正确的输出。

编辑

我最初认为可能有一个简单的技巧可以用来为axis实现dask.array.unique参数。但是,由于存在块,blob type trick that numpy.unqiue uses to implement its own axis keyword证明不容易转移到Dask数组。

因此,暂时没有巧妙的解决方法。只需使用dask.dataframe