我需要找到数组中每个元素的频率,同时保留有关数组形状的信息。这是因为稍后我需要对其进行迭代。
我尝试了this和this的解决方案。它对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}
答案 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}