Seite 1 von 1

Gruppen von Punkten gleicher Koordinaten finden

Verfasst: Mittwoch 16. März 2016, 09:13
von Poseidonius
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

Re: Gruppen von Punkten gleicher Koordinaten finden

Verfasst: Mittwoch 16. März 2016, 12:41
von miracle173
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.

Re: Gruppen von Punkten gleicher Koordinaten finden

Verfasst: Mittwoch 16. März 2016, 15:53
von Poseidonius
Hallo miracle173,

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

Grüße

Poseidonius

Re: Gruppen von Punkten gleicher Koordinaten finden

Verfasst: Mittwoch 16. März 2016, 18:38
von Poseidonius
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