在不丢失数组形状信息的情况下,找到快速数组中元素的频率?

时间:2019-05-17 19:32:47

标签: dask

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

我尝试了thisthis的解决方案。它对numpy效果很好,但是由于dask数组在大多数操作中需要知道其大小的限制,因此似乎无法在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)

print(unique)
# dask.array<getitem, shape=(nan,), dtype=int64, chunksize=(nan,)>

print(counts)
# dask.array<getitem, shape=(nan,), dtype=int64, chunksize=(nan,)>

我正在寻找与此类似的东西:

import dask.array as da

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

print(da.frequency(arr))
# {1: 3, 2: 1, 3:1, 4:2}

2 个答案:

答案 0 :(得分:1)

我发现该解决方案对于包含许多唯一值(> 50k)的大量(〜375亿个元素)数据是最快的。

import dask
import dask.array as da

arr = da.from_array(some_large_array)

bincount = da.bincount(arr)
bincount = bincount[bincount != 0]  # Remove elements not in the initial array
unique = da.unique(arr)

# Allows to have the shape of the arrays
unique, counts = dask.compute(unique, bincount)
unique = da.from_array(unique)
counts = da.from_array(counts)

frequency = da.transpose(
    da.vstack([unique, counts])
)

答案 1 :(得分:0)

也许您可以在创建频率计数后直接调用dask.compute。大概在这一点上,您的数据集很小,现在是从Dask Array过渡回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}