Eu tenho uma lista de conjuntos dados por,
sets1 = [{1},{2},{1}]
Quando encontro os elementos exclusivos nesta lista usando números unique
, recebo
np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)
Como pode ser visto, o resultado está errado, como {1}
é repetido na saída.
Quando altero a ordem na entrada, tornando elementos semelhantes adjacentes, isso não acontece.
sets2 = [{1},{1},{2}]
np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)
Por que isso ocorre? Ou há algo errado na maneira como eu fiz?
sets1.sort()
não altera a ordem da lista. Acho que você precisa para criar uma funçãof
para classificar os conjuntos com base em qualquer critério que você deseja e, em seguida, passarsets1.sort(key=f)
paranp.unique()
Respostas:
O que acontece aqui é que a
np.unique
função é baseada nanp._unique1d
função do NumPy (consulte o código aqui ), que por si só usa o.sort()
métodoAgora, classificar uma lista de conjuntos que contêm apenas um número inteiro em cada conjunto não resultará em uma lista com cada conjunto ordenado pelo valor do número inteiro presente no conjunto. Então teremos (e não é isso que queremos):
Agora, como você apontou, se a lista de conjuntos já estiver ordenada da maneira que você deseja,
np.unique
funcionará (já que você teria ordenado a lista anteriormente).Uma solução específica (porém, lembre-se de que ela funcionará apenas para uma lista de conjuntos que cada um contém um único número inteiro) seria:
fonte
Isso porque set é do tipo unhashable
você pode usar python
collections.Counter
se puder converter o conjunto para tupla como abaixofonte
is
o teste não está relacionado ao hashability. A falta de capacidade de hash não é a razão pela qual np.unique () não funciona em conjuntos: de acordo com a resposta aceita, a falta de total ordenação é a razão. O uso de tupla () em conjuntos não garante a ordem de saída; portanto, dois conjuntos com os mesmos elementos podem ser convertidos incorretamente em tuplas diferentes.