Tengo una lista de conjuntos dados por,
sets1 = [{1},{2},{1}]
Cuando encuentro los elementos únicos en esta lista usando numpy's unique
, obtengo
np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)
Como se puede ver visto, el resultado es incorrecto como {1}
se repite en la salida.
Cuando cambio el orden en la entrada haciendo elementos similares adyacentes, esto no sucede.
sets2 = [{1},{1},{2}]
np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)
¿Por qué ocurre esto? ¿O hay algo mal en la forma en que lo he hecho?
sets1.sort()
no cambia el orden de la lista. Creo que debe crear una funciónf
para ordenar los conjuntos según los criterios que desee, y luego pasarsets1.sort(key=f)
anp.unique()
Respuestas:
Lo que sucede aquí es que la
np.unique
función se basa en lanp._unique1d
función de NumPy (vea el código aquí ), que a su vez utiliza el.sort()
método.Ahora, ordenar una lista de conjuntos que contienen solo un número entero en cada conjunto no dará como resultado una lista con cada conjunto ordenado por el valor del número entero presente en el conjunto. Entonces tendremos (y eso no es lo que queremos):
Ahora, como ha señalado, si la lista de conjuntos ya está ordenada de la manera que desea,
np.unique
funcionará (ya que habría ordenado la lista de antemano).Una solución específica (sin embargo, tenga en cuenta que solo funcionará para una lista de conjuntos que contienen un solo entero) sería:
fuente
Esto se debe a que el conjunto es de tipo no compartible
puedes usar python
collections.Counter
si puedes convertir el conjunto a tupla como a continuaciónfuente
is
las pruebas no están relacionadas con la capacidad de hashabilidad. La falta de hashability no es la razón por la que np.unique () no funciona en conjuntos: de acuerdo con la respuesta aceptada, la falta de ordenamiento total es esa razón. El uso de tuple () en conjuntos no garantiza el orden de salida, por lo que dos conjuntos con los mismos elementos podrían convertirse incorrectamente en tuplas diferentes.