2016-05-19 11 views
0

Meine Daten sind in einer Tabelle im Format Fits (example.fits) organisiert. Ich öffne diese Tabelle ('mappars') mit dem Python-Modul atpy. Die Tabelle hat Spalten x, y, die Bildkoordinaten sind, und eine Datenspalte z. Die x, y sind gleichmäßig verteilt (Ereignisse auf einem CCD-Detektor), aber dazwischen gibt es Lücken.Effizient Mitte des Bildes in Python mit Astropie erhalten

Ich erhalte den Wert in der Mitte des Bildes wie folgt aus:

import atpy 
import numpy as np 

mappars = atpy.Table('example.fits') 
#get midpoint value 
midx = np.int((np.max(mappars['x'])+np.min(mappars['x']))/2) 
midy = np.int((np.max(mappars['y'])+np.min(mappars['y']))/2) 
midist = mappars.where((mappars.x == midx) & (mappars.y == midy)['z'] 

Gibt es eine effizientere Art und Weise, dies zu tun (ohne die .wo Funktion, die Teil atpy ist)? Gibt es auch eine Funktion, die .where in astropy .table, da ich von atpy zu astropy wechseln möchte?

Antwort

1

Sie sollten dies sehr ähnlich mit astropy.io und numpy tun können. Ich habe nicht eine Ereignisdatei zur Hand hat, aber so etwas wie:

von astropy.io Import paßt Import numpy als np

with fits.open("example.fits") as hdulist: 
    events = hdulist[1].data # since hdu 0 should be an ImageHDU type, the events are probably in the first extension 
    midx = np.int((np.max(events['x'])+np.min(events['x']))/2) 
    midy = np.int((np.max(events['y'])+np.min(events['y']))/2) 
    midist = events['z'][(events['x'] == midx) & (events['y'] == midy)] 

In diesem Fall Ich erstelle direkt einen boolean Index-Array events['z'] mit dem booleschen (numpy) Ausdruck events['x'] == midx) & (events['y'] == midy).

Beachten Sie, dass dies nicht getestet ist; Wenn das obige für Sie fehlschlägt, kann ich wahrscheinlich versuchen, eine Ereignisdatei irgendwo aus dem Internet zu ziehen, um sie zu testen, es sei denn, Ihre Ereignisdatei ist seltsam.


By the way, wenn x und y sind, sagen wir, integer Pixelkoordinaten, können Sie die Dinge etwas einfacher durch reine Integer-Division mit und die Besetzung überspringen int:

midx = (np.max(events['x'])+np.min(events['x']))//2 
midy = (np.max(events['y'])+np.min(events['y']))//2 

Dies funktioniert in Python 3 direkt und in Python 2, wenn Sie from __future__ import division haben (das sollten Sie wahrscheinlich sowieso tun).

+0

Vielen Dank, das hat funktioniert! Ich habe nur zwei kleine Änderungen am Code vorgenommen, damit er mit dem spezifischen Format meines Tisches funktioniert. Auch 'from __future__ import division' funktionierte gut (mit Python 2.7). – Florian

+1

Schön. Auch Ihre Bearbeitung war korrekt, wurde aber abgelehnt, weil sie so spezialisiert war, dass die Rezensenten den (offensichtlichen) Fehler, den ich gemacht hatte, und Ihre Korrektur nicht erkannt hatten. Das habe ich jetzt selbst behoben. – Evert