У меня есть список наборов, заданных,
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)
Почему это происходит? Или что-то не так в том, что я сделал?
sets1.sort()
это не меняет порядок списка. Я думаю, что вам нужно создать функциюf
для сортировки наборов на основе любых критериев, которые вы хотите, а затем перейтиsets1.sort(key=f)
кnp.unique()
Ответы:
Здесь происходит то, что
np.unique
функция основана наnp._unique1d
функции из NumPy (см. Код здесь ), которая сама использует.sort()
метод.Теперь, сортировка списка наборов, которые содержат только одно целое число в каждом наборе , не приведет к списку с каждым набором, упорядоченным по значению целого числа, присутствующего в наборе. Таким образом, мы будем иметь (и это не то, что мы хотим):
Теперь, как вы указали, если список наборов уже упорядочен так, как вы хотите,
np.unique
будет работать (так как вы бы отсортировали список заранее).Одно конкретное решение (хотя, имейте в виду, что оно будет работать только для списка наборов, каждый из которых содержит одно целое число), будет:
источник
Это потому, что набор не подлежит изменению
Вы можете использовать Python,
collections.Counter
если вы можете преобразовать набор в кортеж, как показано нижеисточник
is
тестирование не имеет отношения к хешабильности. Нехватка хэшируемости не является причиной, по которой np.unique () не работает на наборах: в соответствии с принятым ответом, причиной является отсутствие полного упорядочения. Использование tuple () для наборов не гарантирует порядок вывода, поэтому два набора с одинаковыми элементами могут быть неправильно преобразованы в разные кортежи.