numpy.unique gibt eine falsche Ausgabe für die Liste der Sätze aus


14

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?


1
Ich bin mir nicht sicher, warum es nicht funktioniert, aber ich vermute, dass es damit zu tun hat, dass sets1.sort()sich die Reihenfolge der Liste nicht ändert. Ich denke, Sie müssen eine Funktion erstellen f, um die Sätze nach den gewünschten Kriterien zu sortieren, und dann sets1.sort(key=f)annp.unique()
ATK7474

Antworten:


8

Was hier passiert, ist, dass die np.uniqueFunktion auf der np._unique1dFunktion 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):

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

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

Nun, wie Sie bereits betont haben, np.uniquefunktioniert 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:

np.unique(sorted(sets, key=lambda x: next(iter(x))))

-1

Das liegt daran, dass set ein nicht zerlegbarer Typ ist

{1} is {1} # will give False

Sie können Python verwenden, collections.Counterwenn Sie das Set wie unten beschrieben in Tupel konvertieren können

from collections import Counter
sets1 = [{1},{2},{1}]
Counter([tuple(a) for a in sets1])

isDas 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.
Marius Gedminas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.