numpy.unique дает неправильный вывод для списка наборов

14

У меня есть список наборов, заданных,

sets1 = [{1},{2},{1}]

Когда я нахожу уникальные элементы в этом списке, используя Numpy unique, я получаю

np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)

Как видно, результат неверный, что {1}повторяется на выходе.

Когда я изменяю порядок на входе, размещая похожие элементы рядом, этого не происходит.

sets2 = [{1},{1},{2}]

np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)

Почему это происходит? Или что-то не так в том, что я сделал?

Rashid
источник
1
Я не уверен, почему это не работает, но я подозреваю, что это связано с тем, что sets1.sort()это не меняет порядок списка. Я думаю, что вам нужно создать функцию fдля сортировки наборов на основе любых критериев, которые вы хотите, а затем перейти sets1.sort(key=f)кnp.unique()
ATK7474

Ответы:

8

Здесь происходит то, что np.uniqueфункция основана на np._unique1dфункции из NumPy (см. Код здесь ), которая сама использует.sort() метод.

Теперь, сортировка списка наборов, которые содержат только одно целое число в каждом наборе , не приведет к списку с каждым набором, упорядоченным по значению целого числа, присутствующего в наборе. Таким образом, мы будем иметь (и это не то, что мы хотим):

sets = [{1},{2},{1}]
sets.sort()
print(sets)

# > [{1},{2},{1}]
# ie. the list has not been "sorted" like we want it to

Теперь, как вы указали, если список наборов уже упорядочен так, как вы хотите, np.uniqueбудет работать (так как вы бы отсортировали список заранее).

Одно конкретное решение (хотя, имейте в виду, что оно будет работать только для списка наборов, каждый из которых содержит одно целое число), будет:

np.unique(sorted(sets, key=lambda x: next(iter(x))))
Принц-полукровка
источник
-1

Это потому, что набор не подлежит изменению

{1} is {1} # will give False

Вы можете использовать Python, collections.Counterесли вы можете преобразовать набор в кортеж, как показано ниже

from collections import Counter
sets1 = [{1},{2},{1}]
Counter([tuple(a) for a in sets1])
Дев Хадка
источник
isтестирование не имеет отношения к хешабильности. Нехватка хэшируемости не является причиной, по которой np.unique () не работает на наборах: в соответствии с принятым ответом, причиной является отсутствие полного упорядочения. Использование tuple () для наборов не гарантирует порядок вывода, поэтому два набора с одинаковыми элементами могут быть неправильно преобразованы в разные кортежи.
Мариус Гедминас