在不丢失阵列形状信息的情况下查找dask阵列中元素的频率?

在不丢失阵列形状信息的情况下查找dask阵列中元素的频率?,dask,Dask,我需要找到数组中每个元素的频率,同时保留有关数组形状的信息。这是因为我以后需要对它进行迭代 我试了一个也试了一个。它适用于numpy,但在dask中似乎不起作用,因为dask阵列在大多数操作中需要知道其大小 将dask.array导入为da arr=da.from_数组([1,1,1,2,3,4,4]) 唯一,计数=da.unique(arr,返回计数=True) 打印(唯一) #dask阵列 打印(计数) #dask阵列 我正在寻找类似的东西: 将dask.array导入为da arr=da

我需要找到数组中每个元素的频率,同时保留有关数组形状的信息。这是因为我以后需要对它进行迭代

我试了一个也试了一个。它适用于numpy,但在dask中似乎不起作用,因为dask阵列在大多数操作中需要知道其大小

将dask.array导入为da
arr=da.from_数组([1,1,1,2,3,4,4])
唯一,计数=da.unique(arr,返回计数=True)
打印(唯一)
#dask阵列
打印(计数)
#dask阵列
我正在寻找类似的东西:

将dask.array导入为da
arr=da.from_数组([1,1,1,2,3,4,4])
打印(数据频率(arr))
# {1: 3, 2: 1, 3:1, 4:2}

也许您可以在创建频率计数后直接调用
dask.compute
。在这一点上,您的数据集可能很小,现在正是从Dask数组过渡到NumPy的好时机

import dask
import dask.array as da

arr = da.from_array([1, 1, 1, 2, 3, 4, 4])

unique, counts = da.unique(arr, return_counts=True)

unique, counts = dask.compute(unique, counts)
result = dict(zip(unique, counts))
# {1: 3, 2: 1, 3: 1, 4: 2}

我发现这个解决方案对于具有许多唯一值(>50k)的大量数据(~375亿个元素)来说是最快的

导入dask
将dask.array导入为da
arr=da.来自数组(一些大型数组)
bincount=da.bincount(arr)
bincount=bincount[bincount!=0]#删除不在初始数组中的元素
唯一=da.唯一(arr)
#允许具有阵列的形状
unique,counts=dask.compute(unique,bincount)
unique=da.来自_数组(unique)
计数=数组中的da(计数)
频率=da转置(
da.vstack([唯一,计数])
)

当我尝试使用我的数据集样本(~600MB)时,这是可行的,但我不确定它在整个数据集(~75GB)上的扩展效果如何。我一定要试一试。非常感谢。我尝试了您建议的解决方案,但是由于数据量大,并且有许多独特的值,速度似乎会大大减慢。我设法找到了另一个相当快的解决方案(见下文)。我认为这可能是由于
da.unique
中的
返回\u counts=True
造成的。也许这需要一些优化;我可以在github上打开一个问题,你认为它很有用。干得好!在调用dask.compute之后,您可能会从dask.array函数切换到numpy函数。此时您可能不再需要Dask。