Найти частоту элементов в массиве dask без потери информации о форме массива? - PullRequest
1 голос
/ 17 мая 2019

Мне нужно найти частоту каждого элемента в массиве, сохраняя при этом информацию о форме массива.Это потому, что мне нужно будет повторить это позже.

Я пробовал это решение, а также это одно.Это хорошо работает для 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 ]

1 голос
/ 21 мая 2019

Я обнаружил, что это решение было самым быстрым для большого количества (~ 37,5 миллиардов элементов) данных со многими уникальными значениями (> 50 КБ).

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])
)
0 голосов
/ 18 мая 2019

Возможно, вы можете позвонить 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}
...