python - 在不使用 dask 数据框的情况下获取 dask 数组的唯一行

标签 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)

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

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

最佳答案

你总是可以只使用 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。这种方法可确保您获得正确的输出,即使它不是最快的实现方式。

编辑

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

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

关于python - 在不使用 dask 数据框的情况下获取 dask 数组的唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53389534/

相关文章:

python - 如何仅使用 pcolor/pcolormesh 绘制网格线

python - 访问 dask 集群中分散数据的成本

python - AppRegistryNotReady : The translation infrastructure cannot be initialized

python - 从列表到元组

python - Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号

python - 即使在 gc.collect() 之后,分配给 Python 的内存也不会在 Linux 中释放回来

python - 使用 python 内置函数进行耦合 ODE

Python:如何计算geotiff数组中值为1的相邻值?

python - dask:如何避免任务超时?

python - Dask作业队列设计模式?