Die Suche nach einzigartigen Punkte im numpy array
Was ist ein schneller Weg zu finden, einzigartige x -, y-Punkte (entfernen Sie Duplikate) in ein numpy-array wie:
points = numpy.random.randint(0, 5, (10,2))
Ich dachte, der Umwandlung von Punkten zu einem komplexen zahlen und dann die überprüfung für einzigartig, aber das scheint eher verworren:
b = numpy.unique(points[:,0] + 1j * points[:,1])
points = numpy.column_stack((b.real, b.imag))
- Wenn Sie nicht benötigen, um zu erhalten, benutzen Sie Tupel, für die Punkte und konvertiert die Liste in ein set.
- Ich brauche das Ergebnis in ein numpy-array, so das scheint wie eine Menge von Umbauten.
- Gibt es einen wirklichen Grund, warum die einfache Lösung
numpy.vstack([numpy.array(u) for u in set([tuple(p) for p in points])])
ist nicht schnell genug? - Denken es muss einen schnelleren Weg als Liste Verständnis, wenn es um längere Listen von Punkten, Nein?
- Wim-Methode ist schneller, insbesondere bei größeren arrays. Wahrscheinlich, weil es nicht stört Sortieren Sie das Ergebnis. Ich habe einige timeit benchmarks zu meinem post. Vielleicht wim wird post seine Lösung als Antwort?
- Ok, ich werde es hinzufügen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde es so machen:
numpy.array(list(set(tuple(p) for p in points)))
Für die schnelle Lösung, in der die meisten Allgemeinen Fall, vielleicht, dieses Rezept würde Sie interessieren:
http://code.activestate.com/recipes/52560-remove-duplicates-from-a-sequence/
set
, das ist eine ungeordnete collection.Ich denke, Sie haben eine sehr gute Idee hier. Denken über die zugrunde liegenden Speicherblock verwendet zur Darstellung der Daten in
points
. Wir sagen numpy zu betrachten, dass block repräsentiert ein array der Form (10,2) mit dtypeint32
(32-bit-Ganzzahlen), aber es ist fast kostenlos, um sagen numpy zu betrachten, die denselben Speicherblock, der als Vertretung ein array der Form (10) mit dtypec8
(64-bit-komplexe).Also der einzige wirkliche Kosten ist der Aufruf
np.unique
, gefolgt von einem weiteren praktisch kostenlos anrufen, umview
undreshape
:Erträge
während
Erträge
Wenn Sie nicht brauchen, das Ergebnis sortiert werden, wim Methode ist schneller (möchten Sie vielleicht zu prüfen, zu akzeptieren seine Antwort...)
ergeben diese benchmarks:
np.random.seed(...)
oder eine konkretepoints
array.)