Mit KDTree bestimmte Punkte aus Punktwolke filtern

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Hi Leute,

ich habe ein Array mit zeilenweise eingetragenen Punkten (in drei Spalten die jeweiligen x-, y- und z-Koordinaten) und muss Punkte herausfiltern die in einem bestimmten minimalen und maximalen Abstand von einem bestimmten Punkt liegen. Dafür kann mir die KDTree-Funktion "query_radius" helfen. Mit dieser Funktion kann ich alle Punkte herausfinden, die sich innerhalb des maximalen Radius befinden und mir dafür die Listen "ind" (Indizes der gültigen Punkte) und "dist" (jeweiliger Abstand zum zetralen Punkt) ausgeben lassen.

Code: Alles auswählen

from sklearn.neighbors import KDTree

tree = KDTree(points_plusRand) #points_plusRand ist die Punktwolke
ind, dist = tree.query_radius(points_plusRand[:1], r=max_radius, return_distance=True)
Jetzt weiß ich einfach nicht wie ich weitermachen muss, um nochmal alle Punkte innerhalb des maximalen Abstands nach dem minimalen Abstand zu filtern. Ich habe mit den Indizes und Abständen der Punkte ja eigentlich alles was ich brauche, aber ich kann meine Gedanken nicht so ordnen und im Code ausdrücken wie ich gerne möchte.

Könnt ihr mir helfen? Ich habe einen Knoten im Kopf.

Viele Grüße
Hans-Uwe
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Alle Indizes, zu deren korrespondierendem dist der Wert >= größer deines mindestabstandes ist.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Klar, aber wie schreibe ich dazu den Code? Ich weiß nicht wie ich über die Einträge der Distanzen, die innerhalb des maximalen und minimalen Abstand liegen, die Indize-Liste beschneiden soll, um damit die gesuchten Punkte der Punktwolke zu finden. Ich schaffe es einfach nicht diese Abfolge in mein Programm zu übersetzen..
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Ich würde es vielleicht so machen:

Code: Alles auswählen

ind = ind[dist>=min_radius]
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Ganz so einfach ist es leider nicht. :|

Mit meinen for-Schleifen komme ich leider auch nicht weiter..
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie wäre es, wenn du die mal zeigst? Und das am besten anhand eines abgeschlossenen Beispiels, das wir selbst ausprobieren & verbessern können.
Antworten