Gruppen von Punkten gleicher Koordinaten finden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

Hallo zusammen,

ich habe ein Array mit 300000 Punkten [x,y,z] vorliegen und soll darin Gruppen von gleichen [x,y] Koordinaten finden, um dann über den zugehörigen z Werten eine statistische Untersuchung anzustellen. Meine intuitive Lösung für die Identifikation der zusammengehörigen Punkte (wie gesagt mit gleichen x,y Koordinaten) sieht so aus

Code: Alles auswählen

import numpy as np
#                          x y z
coordinates = np.array( [ (1,2,1), 
                          (3,4,1),
                          (1,2,2), 
                          (3,4,3),
                          (1,2,5), 
                          (3,4,3),
                          (1,5,1),
                          (2,4,3),
                          (1,2,2) ])

x_ = np.unique(coordinates[:,0])
y_ = np.unique(coordinates[:,1])

for x_value in x_:
  for y_value in y_:
     result = np.where((coordinates[:,0]==x_value) & (coordinates[:,1]==y_value))
     if result[0].size:
        print result
Entsprechend ergibt sich die Ausgabe:

Code: Alles auswählen

(array([0, 2, 4, 8]),)
(array([6]),)
(array([7]),)
(array([1, 3, 5]),)
Das geht doch aber bestimmt eleganter und vor allem flotter? Freue mich auf Eure Anregungen!

Poseidonious
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

Hallo
ich würde ein Liste der Koordinaten [x,y,z] nach x und y sortieren, dann liegen die mit gleichem x und y in der sortierten Listen hintereinander.
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

Hallo miracle173,

ok, aber kann ich denn die Gruppen besonders elegant auslesen ohne die Liste vollständig zu durchlaufen?

Grüße

Poseidonius
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

Hallo zusammen,

ich habe nun eine Lösung zusammengebaut, die meine 300000 Datensätze sehr flott umsetzt. Ich benutzt komplexe Zahlen um die Koordinate in einer Variablen zusammenzufassen und wende aus dem itertool package grouped an.

Code: Alles auswählen

from itertools import groupby
from operator import itemgetter
import numpy as np

coordinates = np.array( [ (1,2,1),
                          (3,4,1),
                          (1,2,2),
                          (3,4,3),
                          (1,2,5),
                          (3,4,3),
                          (1,5,1),
                          (2,4,3),
                          (1,2,2) ])

coords = coordinates[:,0] + 1j * coordinates[:,1]
data = np.vstack((coords, coordinates[:,2]))
data = np.transpose(data)
data = data[np.argsort(data[:, 0])]

for key, items in groupby(data, itemgetter(0)):
    print '-' * 20
    print 'x='+str(key.real) + ' y=' + str(key.imag)
    for subitem in items:
        print subitem[1].real
Dafür baue ich mir eine zweispaltige Matrix zusammen, sortiere sie nach der ersten Spalte und wende dann groupby an. Das Zusammenbauen ist glaube ich noch stark verbesserungswürdig. Gibt mir jemand einen Tipp?

Schönen Abend noch

Poseidonius
Antworten