2015-07-14 14 views
5

Ich habe eine Reihe von nahe von 10.000 Punkten am Himmel. Sie sind mit der RA (Rektaszension) und DEC (Deklination) am Himmel geplottet. Wenn sie gezeichnet werden, nehmen sie die Form eines Kreises an.Schneiden eines Kreises in gleichen Segmenten, Python

enter image description here

Was Ich mag würde, ist der Kreis in 8 gleiche Teile zu Scheibe zu tun, und jeden Teil einen nach dem anderen entfernen und einigen Berechnungen bleiben die übrigen Teile verwenden.

Um dies zu tun, kam ich auf diese Illustration im Sinn, d. H. Schneiden sie mit den Bögen.

Ich weiß, dass die Gleichung des Bogens ist gegeben durch:

S = r * theta 

wo

r --> radius 
theta --> angle (in our case 45 degrees) 

ich irgendwie diese wie tun möchte:

slice1 = [] 
for a,b in zip(ra,dec): 
    if a>some value and a<some value and b>some value and b<some value: 
     slice1.append(a,b) 

Wenn sie ein Quadrat, es wird wirklich leicht, und die obige Gleichung kann sofort angewendet werden.

Also sobald ich meine Scheibe habe, kann ich dann eine numpy.where() machen, um den Rest meines Kreises herauszufinden.

Ich kann es leicht in vier Scheiben schneiden, indem Sie nur die min(RA),max(RA),min(DEC) and max(DEC) erwähnen. Ein solches Beispiel, wenn ich es für den ersten Quadranten zu tun gibt mir dies:

RA>0.0 and RA<max(RA) DEC>0.0 and DEC<max(DEC) 

enter image description here

Ich weiß nicht, wie über das tun dies in meinem Fall gehen (dh in 8 Quadranten !!), wobei ich nur die x, y Koordinaten meiner Datenpunkte habe !!

Antwort

4

Sie das Array von Slice-Nummern direkt mit mit numpy Betreiber berechnen kann:

sliceno = numpy.int32((pi + numpy.arctan2(Y, X)) * (N/(2*pi))) 

Bedeutung:

  • berechnen den Winkel -pi ... pi für jeden Punkt mit arctan2
  • Verschiebung um pi, um es zu einem positiven Intervall
  • zu machen
  • -0 rescale .. N-1
  • auf eine ganze Zahl für die verzögerte Antwort
+0

Ich kann es immer noch nicht ganz verstehen, aber was für eine schwarze Magie ist das !!! – ThePredator

+0

Ich kann sehen, dass sliceno mir meine 8 Quadranten gibt, aber können Sie weiter aufklären ?? !! – ThePredator

+0

@ThePredator: Ich habe die Antwort bearbeitet, um Bittricks zu vermeiden und arbeite stattdessen mit einem generischen 'N' für die Anzahl der Slices. – 6502

5

Sie sollen wahrscheinlich math.atan2 verwenden:

angle = math.atan2(dec, ra) 
if angle >= n*math.pi/4 and angle < (n+1)*math.pi/4: 
    # point is inside slice number n 

Grundsätzlich ATAN2 den Winkel bis zu dem Punkt zurück, von der x-Achse. Indem Sie es in Intervalle von Pi/4 teilen, erhalten Sie Ihre Scheiben. Aber Vorsicht - atan2 gibt Winkel zwischen -pi und pi zurück, daher sollten Sie Ihre Slices von -4 bis 3 nummerieren (oder Sie können pi zum Winkel hinzufügen oder auf eine andere Weise konvertieren).

EDIT: Ihr Code ändern, würde es so aussehen:

slice1 = [] 
n = 0 #change 0 to desired slice number here (from -4 to 3) 
for a,b in zip(ra,dec): 
    angle = math.atan2(b,a) 
    if angle >= n*math.pi/4 and angle < (n+1)*math.pi/4: 
     slice1.append(a,b) 
+0

leid konvertieren, wenn ich 'Winkel = Math.atan2 (data_dec_par, data_ra_par)' ich 'Typeerror: nur Länge-1-Arrays kann in Python-Skalare umgewandelt werden. – ThePredator

+0

Ich vermute, weil 'data_dec_par' und' data_ra_par' Listen sind, und ich nehme an, dass 'ra' und' dec' Zahlen sind. Sie müssen Punkte durchlaufen, zum Beispiel wie zuvor ('für a, b in zip (ra, dec): usw.). – ebvalaim

+0

Sie meinen wie: 'für a, b in zip (ra, dec):' 'Winkel = arctan()' und dann mache ich die 'if' Anweisung? Kannst du das über eine Bearbeitung erklären, wenn möglich? – ThePredator

2

Suchen Sie zunächst den Quadranten Ihre Formel. Der Oktant kann dann durch Vergleichen von abs(x) mit abs(y) bestimmt werden.

Im unteren Oktanten, abs(x) >= abs(y).Der andere hat abs(x) < abs(y)

+1

Das OP möchte keine Quadranten ... – SiHa

+0

Er wusste schon wie man die Quadranten findet, er wollte den Kreis in 8 aufteilen. – pingul

+0

@SiHa Die Formel war irgendwie korrekt , die Erklärung war falsch. Fest. –