Ich habe eine Liste von Sets gegeben von,
sets1 = [{1},{2},{1}]
Wenn ich die eindeutigen Elemente in dieser Liste mithilfe von Numpys finde unique
, erhalte ich
np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)
Wie zu sehen ist, ist das Ergebnis falsch, wie {1}
es in der Ausgabe wiederholt wird.
Wenn ich die Reihenfolge in der Eingabe ändere, indem ich ähnliche Elemente benachbart mache, geschieht dies nicht.
sets2 = [{1},{1},{2}]
np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)
Warum tritt das auf? Oder stimmt etwas nicht, wie ich es getan habe?
sets1.sort()
sich die Reihenfolge der Liste nicht ändert. Ich denke, Sie müssen eine Funktion erstellenf
, um die Sätze nach den gewünschten Kriterien zu sortieren, und dannsets1.sort(key=f)
annp.unique()
Antworten:
Was hier passiert, ist, dass die
np.unique
Funktion auf dernp._unique1d
Funktion von NumPy basiert (siehe Code hier ), die selbst die.sort()
Methode verwendet.Wenn Sie nun eine Liste von Mengen sortieren, die nur eine Ganzzahl in jeder Menge enthalten, wird keine Liste mit jeder Menge erstellt, die nach dem Wert der in der Menge vorhandenen Ganzzahl geordnet ist. Also werden wir haben (und das ist nicht was wir wollen):
Nun, wie Sie bereits betont haben,
np.unique
funktioniert es, wenn die Liste der Sets bereits so geordnet ist, wie Sie es möchten (da Sie die Liste zuvor sortiert hätten).Eine spezifische Lösung (bitte beachten Sie jedoch, dass dies nur für eine Liste von Mengen funktioniert, die jeweils eine einzelne Ganzzahl enthalten) wäre dann:
quelle
Das liegt daran, dass set ein nicht zerlegbarer Typ ist
Sie können Python verwenden,
collections.Counter
wenn Sie das Set wie unten beschrieben in Tupel konvertieren könnenquelle
is
Das Testen hat nichts mit der Hashfähigkeit zu tun. Mangelnde Hash-Fähigkeit ist nicht der Grund, warum np.unique () bei Sets nicht funktioniert: Laut der akzeptierten Antwort ist das Fehlen einer vollständigen Reihenfolge dieser Grund. Die Verwendung von tuple () für Sätze garantiert nicht die Reihenfolge der Ausgabe, sodass zwei Sätze mit denselben Elementen möglicherweise fälschlicherweise in verschiedene Tupel konvertiert werden.