2017-12-05 4 views
0

Meine Aufgabe ist es, Galaxien zusammenzubringen, die aus einer großen Galaxienreihe am nächsten sind. Ich habe die RA, DEC und Z von jedem, und eine Formel, um den Abstand zwischen jedem von den gegebenen Daten auszuarbeiten. Allerdings kann ich keine effiziente Methode der Iteration über die gesamte Liste ausarbeiten, um die Entfernung zwischen JEDER Galaxie und JEDER anderen Galaxie in der Liste zu finden, mit der Absicht, dann jede Galaxie mit ihrem nächsten Nachbarn abzugleichen.Finden Sie den Abstand zwischen den Galaxien in den Daten und erstellen Sie Paare basierend auf dem geringsten Abstand

Die Daten in der folgenden Art und Weise eingeführt worden:

hdulist = fits.open("documents/RADECMASSmatch.fits") 
    CATAID = data['CATAID_1'] 
    Xpos_DEIMOS_1 = data['Xpos_DEIMOS_1'] 
    z = data['Z_1'] 
    RA = data['RA'] 
    DEC = data['DEC'] 

Ich habe versucht, so etwas wie:

radiff = [] 
    for i in range(0,n): 
     for j in range(i+1,n): 
      radiff.append(abs(RA[i]-RA[j])) 

zunächst Unterschied in RA zu trainieren und DEC zwischen jeder Galaxie, die eigentlich tut arbeite, aber ich habe das Gefühl, dass es einen besseren Weg geben muss.

Ein Freund schlug vor, etwas entlang der Linien von:

galaxy_coords = (data['RA'],data['DEC'],data['Z]) 
    separation_matrix = np.zeros((len(galaxy_coords),len(galaxy_coords)) 

    done = [] 
    for i, coords1 in enumerate(galaxy_coords): 
      for j, coords2 in enumerate(galaxy_coords): 
       if (j,i) in done: 
        separation_matrix[i,j] += separation matrix[j,i] 
        continue 
        separation = your_formula(coords1, coords2) 
        separation_matrix[i,j] += separation 
        done.append((i,j)) 

Aber ich das nicht wirklich verstehen, so kann es nicht ohne weiteres anwenden. Ich habe es versucht, aber es bringt nichts nützliches.

Jede mögliche Hilfe bei diesem würde sehr geschätzt, dank

+0

Haben Sie untersucht, ob ['astropy.coordinates'] (http://docs.astropy.org/en/stable/coordinates/matchsep.html#tracycle-coordinates-matching) für Sie nützlich ist. Es kann Kataloge zuordnen (obwohl es nicht automatisch Paare für Sie erstellt). Es benutzt scipys kd-Baum unter der Haube. – Evert

+0

Nicht sicher, es hilft mir für diese erste Phase, aber sieht aus wie es sehr hilfreich für die nächste sein wird, wo ich zu einem neuen Koordinatensystem basierend auf der Trennlinie von jedem Galaxiepaar wechseln müssen – enceledus

Antwort

0

Code Ihres Freundes scheint zwischen jedem Paar ein 2D-Array der Abstände zu erzeugen ist, und unter Ausnutzung der Symmetrie (Abstand (x, y) = Abstand (y, x)). Es wäre etwas besser, wenn es itertools verwendet, um Kombinationen zu generieren, und your_formula(coords1, coords2) zu separation_matrix[i,j] und separation_matrix[j,i] innerhalb derselben Iteration zugewiesen wird, anstatt getrennte Iterationen für beide i, j und j, i.

Noch besser wäre wahrscheinlich dieses Paket, das einen tree-basierten Algorithmus verwendet: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.KDTree.html. Es scheint sich auf geradlinige Koordinaten zu konzentrieren, aber das sollte in linearer Zeit adressierbar sein.

+0

Würdest du mir zeigen können Was meinst du? Ich bin mit Itertools und iterativer Codierung im Allgemeinen nicht allzu vertraut. Danke – enceledus

+0

Wenn du 'itertools.combinations (len (galaxy_coords), 2)' machst, erhältst du jedes Paar unterschiedlicher Indizes von 0 bis len (galaxy_coords) -1. Es wird dir keine Paare der Form (i, i) geben, und wenn es dir (i, j) gibt, wird es dir nicht geben (j, i). Da Sie wissen, dass die Entfernung von irgendetwas zu sich selbst Null ist und die Entfernung von der Galaxie [i] zur Galaxie [j] dieselbe wie die Entfernung von der Galaxie [j] zur Galaxie [i] ist, erhalten Sie alle benötigten Paare . – Acccumulation

+0

brilliant, vielen dank! – enceledus

Verwandte Themen