Есть ли какая-либо функция, эквивалентная np.unique для объекта generi c в Python - PullRequest
0 голосов
/ 26 мая 2020

np.unique() может возвращать индексы первого вхождения, индексы для восстановления и количество вхождений. Есть ли какая-нибудь функция / библиотека, которая может сделать то же самое для любого объекта Python?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Не как таковое. Вы можете получить аналогичную функциональность, используя разные классы в зависимости от ваших потребностей.

unique без дополнительных флагов дает результат, аналогичный set:

unique_value = set(x)

collections.Counter имитирует return_counts:

counts = collections.Counter(x)
unique_values = list(counts.keys())
unique_counts = list(counts.values())

Для имитации c return_index, используйте list.index на set или Counter. Это предполагает, что контейнер представляет собой список

first_indices = [x.index(k) for k in counts]

Чтобы смоделировать return_inverse, мы посмотрим, как unique фактически реализован. unique сортирует ввод, чтобы получить запуск элементов. Аналогичный метод может быть получен через sorted (или на месте list.sort) и itertools.groupby:

s = sorted(zip(x, itertools.count()))
inverse = [0] * len(x)
for i, (k, g) in enumerate(itertools.groupby(s, operator.itemgetter(0))):
    for v in g:
        inverse[v[1]] = i

Фактически, подход groupby кодирует все варианты:

s = sorted(zip(x, itertools.count()))
unique_values = []
first_indices = []
unique_counts = []
inverse = [0] * len(x)
for i, (k, g) in enumerate(itertools.groupby(s, operator.itemgetter(0))):
    unique_values.append(k)
    count = 1
    v = next(g)
    inverse[v[1]] = i
    first_indices.append(v[0])
    for v in g:
        inverse[v[1]] = i
        count += 1
    unique_counts.append(count)
0 голосов
/ 26 мая 2020

Вы можете использовать Counter:

> from collections import Counter

> bob = ['bob','bob','dob']
> Counter(bob)
Counter({'bob': 2, 'dob': 1})

> Counter(bob).keys()
dict_keys(['bob', 'dob'])

...