Zurück zum Katalog
Season 11 15 Episoden 1h 3m 2026

Astropy: Python for Astronomy

v7.2 — Ausgabe 2026. Ein umfassender Leitfaden zu Astropy, dem Kernpaket für Astronomie in Python, der Einheiten, Koordinaten, Tabellen, FITS-Dateien, Modellierung und Kosmologie abdeckt (v7.2).

Wissenschaftliches Rechnen Astronomie
Astropy: Python for Astronomy
Aktuelle Wiedergabe
Click play to start
0:00
0:00
1
Das Herzstück von Astropy: Einheiten und Quantities
Entdecken Sie die grundlegenden Konzepte von Astropy: Einheiten und Quantities. Lernen Sie, wie man Skalarwerte und Arrays mit physikalischen Einheiten kombiniert, um die Dimensionsanalyse automatisch zu handhaben.
4m 20s
2
Zeitskalen und Präzision: Das astropy.time-Modul
Erfahren Sie, wie Astropy Sub-Nanosekunden-Präzision über das Alter des Universums hinweg handhabt. Wir behandeln UTC, TAI, Barycentric Dynamical Time und das Time-Objekt.
4m 47s
3
Den Himmel navigieren: Die SkyCoord-Klasse
Lernen Sie, wie Sie Himmelskoordinaten mit der SkyCoord-Klasse definieren und transformieren. Wir erkunden das ICRS, galaktische Referenzsysteme und das Cross-Matching von Katalogen.
3m 58s
4
Jenseits von RA und Dec: 3D-Tracking und Geschwindigkeiten
Gehen Sie über statische 2D-Koordinaten hinaus. Lernen Sie, wie Sie Entfernungen hinzufügen, 3D-Abstände berechnen, Eigenbewegungen modellieren und Korrekturen für Radialgeschwindigkeiten berechnen.
4m 09s
5
Meisterung tabellarischer Daten: Die QTable-Klasse
Entdecken Sie, warum Astropy eine eigene QTable-Klasse hat, anstatt sich rein auf Pandas zu verlassen. Lernen Sie, wie man mehrdimensionale Spalten, Quantities und Mixins speichert.
4m 06s
6
Erweiterte Tabellenoperationen: Masking und Joins
Bringen Sie Ihre QTable-Fähigkeiten auf die nächste Stufe, indem Sie fehlende Daten mit MaskedColumns handhaben und datenbankähnliche Joins ausführen.
4m 09s
7
Das Unified I/O Interface
Lernen Sie, wie Astropy das Lesen und Schreiben von Dateien in einer einzigen einheitlichen Schnittstelle abstrahiert. Wir behandeln den nahtlosen Umgang mit FITS-Tabellen, VOTables und ASCII-Formaten.
4m 02s
8
FITS-Header und HDUs entmystifiziert
Tauchen Sie in das rohe astropy.io.fits-Modul ein, um Header Data Units (HDUs) zu manipulieren. Lernen Sie, wie man nicht standardmäßige FITS-Header parst, bearbeitet und repariert.
4m 03s
9
Umgang mit riesigen FITS-Dateien und Cloud-Speicher
Lernen Sie, wie Sie riesige FITS-Datensätze, die nicht in den RAM passen, mithilfe von Memory Mapping (memmap) handhaben, und entdecken Sie, wie Sie Ausschnitte aus Cloud-Buckets mit fsspec streamen.
4m 08s
10
Gerasterte Daten: Die NDData- und CCDData-Klassen
Steigen Sie von rohen numpy-Arrays auf CCDData um. Lernen Sie, wie Sie 2D-Bilddaten mit Masken, WCS-Metadaten und robusten physikalischen Unsicherheiten bündeln.
4m 09s
11
World Coordinate Systems: Pixel auf den Himmel abbilden
Übersetzen Sie Kamerapixel mithilfe des WCS-Pakets in Himmelskoordinaten. Verstehen Sie die High-Level-API und die Mathematik hinter FITS-Projektionen.
4m 31s
12
Analytische Modelle und Fitting
Tauchen Sie in das astropy.modeling-Modul ein. Lernen Sie, wie man 1D- und 2D-Modelle erstellt, Parameterbeschränkungen anwendet und lineare oder nichtlineare Fitter ausführt.
4m 03s
13
Compound Models und benutzerdefinierte Fits
Erweitern Sie Ihr Modellierungs-Toolkit, indem Sie mehrere mathematische Modelle kombinieren und Ihre eigenen benutzerdefinierten Fitter und einheitenbewussten Modelle definieren.
3m 54s
14
Zeitreihenanalyse: Die Jagd nach Exoplaneten
Analysieren Sie periodische Daten mit dem astropy.timeseries-Modul. Wir gehen das Falten von Lichtkurven und das Entdecken von Perioden mit dem Box Least Squares-Algorithmus durch.
4m 39s
15
Kosmologische Berechnungen: Das Universum vermessen
Führen Sie komplexe Berechnungen auf Universumsebene mit dem astropy.cosmology-Modul durch. Berechnen Sie Rückblickzeiten, Leuchtkraftentfernungen und finden Sie Rotverschiebungen basierend auf dem Alter.
4m 06s

Episoden

1

Das Herzstück von Astropy: Einheiten und Quantities

4m 20s

Entdecken Sie die grundlegenden Konzepte von Astropy: Einheiten und Quantities. Lernen Sie, wie man Skalarwerte und Arrays mit physikalischen Einheiten kombiniert, um die Dimensionsanalyse automatisch zu handhaben.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 1 von 15. Wahrscheinlich hast du schon mal ein NumPy-Array mit einer Konstanten multipliziert. Wenn du aber versehentlich Meter und Kilometer in einer komplexen Gleichung vermischst, warnt Python dich nicht, und dein finales Array enthält einfach die falschen Zahlen. In dieser Folge geht es genau darum, wie die Library die physikalischen Dimensionen automatisch handhabt. Wir schauen uns das Herzstück von Astropy an: Units und Quantities. Astropy verarbeitet physikalische Units über das Quantity-Objekt. Eine Quantity bindet eine Zahl oder ein Array von Zahlen an eine physikalische Unit. Da eine Quantity eine direkte Subclass eines NumPy-ndarrays ist, verlierst du weder an Performance noch an Array-Funktionalität. Du kannst sie nativ slicen, broadcasten und Standard-NumPy-Mathefunktionen darauf anwenden. Sie verhalten sich wie normale Arrays, die zufällig wissen, welche physikalische Eigenschaft sie repräsentieren. Um eine Quantity zu erstellen, importierst du das units-Modul aus Astropy. Anschließend multiplizierst du deine Zahl einfach mit dem spezifischen Unit-Objekt. Drei multipliziert mit units dot parsec erstellt eine Quantity von drei Parsec. Viele Entwickler gehen davon aus, dass diese Abstraktion langsam ist, was ein weit verbreiteter Irrglaube ist. Es stimmt, dass die Multiplikation eines riesigen NumPy-Arrays mit einem Unit-Objekt eine neue Kopie dieses Arrays im Speicher erzeugt. Um diesen Overhead zu vermeiden, macht Astropy einen Override für den bitweisen Left-Shift-Operator, der wie zwei Kleiner-als-Zeichen aussieht. Setze dein bestehendes Array nach links, den Left-Shift-Operator in die Mitte und die Astropy-Unit nach rechts. Dadurch wird die Unit in-place an das Array angehängt, ohne die zugrundeliegenden Daten zu kopieren. Hier ist der entscheidende Punkt. Die Library wertet die mathematischen Beziehungen zwischen den Units während der Berechnung aus. Angenommen, du möchtest die Reisezeit eines Raumschiffs berechnen. Deine Entfernung beträgt 3,0 Parsec. Deine Geschwindigkeit beträgt 130 Kilometer pro Sekunde. Du erstellst eine Quantity für die Entfernung und teilst sie durch die Quantity für die Geschwindigkeit. Astropy gibt eine neue Quantity für die Zeit zurück. Es übernimmt die Division der Werte, berechnet die resultierende Unit und gibt Parsec-Sekunden pro Kilometer zurück. Diese resultierende Unit ist mathematisch korrekt, aber schwer zu lesen. Du kannst das mit der to-Methode ändern, die auf jeder Quantity verfügbar ist. Du rufst die to-Methode auf und übergibst deine Target-Unit, wie zum Beispiel units dot year. Astropy verifiziert, dass die Source- und Target-Dimensionen beides Units für Zeit sind, führt die interne Konvertierung durch und gibt eine neue Quantity in Jahren ausgedrückt zurück. Für schnelle Standardisierungen kannst du auch auf die dot SI oder dot CGS Properties einer beliebigen Quantity zugreifen, um sie sofort in die Base-Units dieser Systeme zu konvertieren. Wenn du Berechnungen durchführst, bei denen sich die Units komplett aufheben, wie etwa beim Teilen von Metern durch Zentimeter, gibt Astropy eine dimensionslose Quantity zurück. Die Unit existiert unter der Haube weiterhin als unskalierter, dimensionsloser Typ. Wenn du dieses Ergebnis an eine externe Library übergeben musst, die Standard-Python-Floats oder einfache NumPy-Arrays erwartet, extrahierst du die rohe Zahl mithilfe des value-Attributs. Bevor du einen finalen Wert extrahierst, denk daran, dass du unübersichtliche, kombinierte Units immer auf ihre absoluten physikalischen Grunddimensionen vereinfachen kannst, indem du die decompose-Methode aufrufst. Wenn du die Show unterstützen möchtest, kannst du auf Patreon nach DevStoriesEU suchen – das hilft uns, weiterhin solche Folgen zu produzieren. Das war’s für diese Folge. Danke fürs Zuhören und keep building!
2

Zeitskalen und Präzision: Das astropy.time-Modul

4m 47s

Erfahren Sie, wie Astropy Sub-Nanosekunden-Präzision über das Alter des Universums hinweg handhabt. Wir behandeln UTC, TAI, Barycentric Dynamical Time und das Time-Objekt.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 2 von 15. Ein Standard-64-Bit-Float kann keinen Timestamp über Milliarden von Jahren darstellen, ohne seine eigene Genauigkeit zu zerstören. Wenn du versuchst, ein weit entferntes Himmelsereignis bis auf die Mikrosekunde genau zu tracken, gehen der Standard-Floating-Point-Arithmetik einfach die Bits aus. Genau diese Hardware-Limitierung ist der Grund, warum wir Time Scales und Precision: Das astropy.time Modul brauchen. Um eine Genauigkeit im Sub-Nanosekundenbereich über die kosmische Geschichte hinweg zu erhalten, vermeidet dieses Modul komplett, eine einzelne Zahl für die Zeitdarstellung zu verwenden. Stattdessen setzt es auf eine clevere Two-Float-Architektur. Unter der Haube wird jeder Zeitwert in zwei separate 64-Bit-Floats gesplittet. Der erste Float speichert den Integer-Anteil des Julianischen Datums, der die ganzen Tage trackt. Der zweite Float speichert den Bruchteil des Tages. Würde Astropy diese zu einer einzigen Variable addieren, würde die Genauigkeit sofort sinken. Indem sie getrennt bleiben, kann die Library lokal hochpräzise Zeit-Arithmetik ausführen, egal wie weit in der Vergangenheit oder Zukunft das Datum liegt. Wenn du ein Time-Objekt erstellst, übergibst du den Zeitwert zusammen mit zwei wichtigen Argumenten: dem Format und der Scale. Hier ist die wichtigste Erkenntnis. Developer verwechseln regelmäßig das visuelle Format eines Datums mit seiner physikalischen Time Scale. Das sind zwei völlig unterschiedliche Konzepte. Das Format bestimmt einzig und allein, wie die Daten gelesen oder geschrieben werden. Gängige Formate sind Standard-ISO-Strings, numerische Modified Julian Dates und spezielle Darstellungen wie FITS-Header. Das Format ist nur der strukturelle Wrapper um die Zahlen. Die Time Scale hingegen definiert den physikalischen Bezugsrahmen dieser Zahlen. Physikalische Time Scales berücksichtigen die Erdrotation, Schaltsekunden und relativistische Effekte. Beispiele dafür sind die Coordinated Universal Time, bekannt als UTC, Terrestrial Time oder TT, und die International Atomic Time oder TAI. Ein Modified Julian Date ist keine physikalische Scale, es ist nur ein Format. Du kannst problemlos einen Timestamp haben, der als Modified Julian Date formatiert ist, aber physikalisch an die UTC-Scale gebunden ist. Du musst sowohl das Format als auch die Scale explizit definieren, wenn du Rohdaten in ein Time-Objekt fütterst. Stell dir vor, du berechnest die Zeitdifferenz zwischen zwei Telemetrie-Timestamps eines Raumfahrzeugs. Du erhältst den ersten Timestamp als ISO-Format-String von gestern und den zweiten Timestamp als ISO-String von heute. Zuerst initialisierst du zwei Time-Objekte. Du übergibst den rohen String an das Objekt, deklarierst das Format als ISO und setzt die Scale auf UTC. Das machst du für beide Timestamps. Da Astropy vektorisierte Operationen unterstützt, könntest du auch ein riesiges Array dieser Strings an ein einziges Time-Objekt übergeben, aber die zugrunde liegende Initialisierungslogik bleibt dieselbe. Um die exakte verstrichene Zeit herauszufinden, subtrahierst du das frühere Time-Objekt vom späteren. Astropy führt automatisch die interne Two-Float-Arithmetik aus und gibt ein TimeDelta-Objekt zurück, das die exakte Dauer enthält. Als Nächstes musst du diesen zweiten Telemetrie-Timestamp auf eine absolute, einheitliche physikalische Scale mappen, um die unvorhersehbaren Sprünge durch UTC-Schaltsekunden zu entfernen. Du nimmst dein zweites Time-Objekt und fragst einfach sein Äquivalent in International Atomic Time ab. Das erreichst du, indem du das TAI-Attribut direkt auf dem Objekt aufrufst. Astropy triggert sofort eine Neuberechnung der internen Floats und verschiebt das Bezugssystem von UTC auf TAI, während die volle Nanosekunden-Genauigkeit erhalten bleibt. Die wahre Stärke des astropy.time Moduls ist, dass du Schaltsekunden oder relativistische Korrekturen nie manuell verwalten musst; du definierst deine Formate und Scales im Voraus, und die Two-Float-Architektur garantiert, dass die Mathematik im gesamten Universum exakt bleibt. Ich möchte mir kurz einen Moment nehmen, um dir fürs Zuhören zu danken – das hilft uns sehr. Mach's gut!
3

Den Himmel navigieren: Die SkyCoord-Klasse

3m 58s

Lernen Sie, wie Sie Himmelskoordinaten mit der SkyCoord-Klasse definieren und transformieren. Wir erkunden das ICRS, galaktische Referenzsysteme und das Cross-Matching von Katalogen.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 3 von 15. Die manuelle Umrechnung von Himmelskoordinaten von einem Reference System in ein anderes erfordert grauenhafte sphärische Trigonometrie. Ein einziger Matrixfehler kann leicht dazu führen, dass dein Teleskop auf die falsche Hemisphäre zeigt. Navigation am Himmel: Die SkyCoord-Klasse übernimmt diese Mathematik für dich und macht aus komplexen sphärischen Transformationen einen simplen Attribute Lookup. In Astropy ist SkyCoord das primäre High-Level-Objekt zur Darstellung von Himmelspositionen. Es fungiert als smarter Wrapper über Lower-Level Coordinate Frames. Wenn du ein Ziel beobachtest, musst du seine Position erfassen. Typischerweise verwendest du Rektaszension und Deklination. Um ein SkyCoord zu erstellen, übergibst du diese beiden Werte, gibst die Units an, wie Grad oder Stunden, und legst das Reference Frame fest. Wenn du kein Frame angibst, fällt es standardmäßig auf das International Celestial Reference System, oder ICRS, zurück. Du kannst problemlos einen einzelnen Punkt am Himmel erstellen, aber das führt zu einer häufigen Falle. User parsen oft ein Data File mit Tausenden von Sternen, erstellen für jeden Stern ein neues SkyCoord-Objekt und speichern sie in einer Standard-Python-Liste. Wenn sie Berechnungen durchführen müssen, loopen sie über diese Liste. Das ist extrem ineffizient und umgeht die Performance-Vorteile der Library komplett. SkyCoord ist dafür gebaut, Arrays nativ zu verarbeiten. Anstatt Tausende einzelner Objekte zu erstellen, übergibst du ein Numpy-Array mit Rektaszensionswerten und ein entsprechendes Array mit Deklinationswerten an eine einzige SkyCoord-Initialisierung. Du bekommst genau ein SkyCoord-Objekt zurück, das deinen gesamten Datensatz enthält. Stell dir ein Szenario vor, in dem du ein neu entdecktes Set von einhundert Radio-Transienten, die in ICRS erfasst wurden, mit einem bestehenden optischen Katalog cross-matchst. Indem du alle einhundert Transienten in ein einziges Array-backed SkyCoord lädst, reicht die Library die Daten an stark optimierte C- und Numpy-Routinen weiter. Operationen, die in einem Python-Loop Minuten dauern würden, werden in Millisekunden ausgeführt. Diese Array-Struktur wird besonders mächtig, wenn du deine Daten transformieren musst. Astronomische Kataloge sind sich nicht immer über ein Koordinatensystem einig. Deine Radio-Transienten sind vielleicht in ICRS, aber womöglich musst du ihre Verteilung relativ zur Ebene der Milchstraße analysieren. Dafür brauchst du das galaktische Koordinatensystem. Hier ist die wichtigste Erkenntnis: Du musst keine Rotationsmatrizen nachschlagen oder Conversion-Funktionen schreiben. Astropy enthält einen riesigen, integrierten Transformation Graph, der weiß, wie man von jedem unterstützten Frame zu jedem anderen unterstützten Frame kommt. Weil SkyCoord diesen Graphen wrappt, dauert das Konvertieren deines gesamten Arrays von einhundert Transienten genau einen Schritt. Du nimmst dein bestehendes SkyCoord-Objekt und rufst seine transform_to-Methode auf, wobei du den Namen des Destination Frames angibst. Noch besser: Für gängige Frames bietet Astropy direkten Attribute Access. Wenn du ein ICRS-SkyCoord-Objekt hast, fragst du einfach das galactic-Attribut ab. Die Library berechnet automatisch die Transformation und gibt ein brandneues SkyCoord-Objekt zurück. Dieses neue Objekt enthält exakt dieselben physikalischen Positionen im Raum, aber dargestellt als galaktische Längen- und Breitengrade. Die wahre Stärke dieser Klasse ist, dass sie die Daten, die eine Himmelsposition repräsentieren, komplett von der zugrundeliegenden sphärischen Geometrie entkoppelt, die nötig ist, um sie durch das Universum der astronomischen Reference Frames zu verschieben. Das war's für diese Folge. Danke fürs Zuhören und keep building!
4

Jenseits von RA und Dec: 3D-Tracking und Geschwindigkeiten

4m 09s

Gehen Sie über statische 2D-Koordinaten hinaus. Lernen Sie, wie Sie Entfernungen hinzufügen, 3D-Abstände berechnen, Eigenbewegungen modellieren und Korrekturen für Radialgeschwindigkeiten berechnen.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 4 von 15. Du weißt vielleicht genau, wo sich ein Stern heute Abend befindet, aber ohne die Korrektur der Eigenbewegung und der Erdgeschwindigkeit wird dein Teleskop im nächsten Jahrzehnt ins Leere blicken. Hier gehen wir über RA und Dec hinaus: 3D-Tracking und Velocities. Standardmäßig bilden Koordinaten eine flache Position am Himmel mithilfe von Winkeln ab. Um ein physikalisches System wie ein Doppelsternsystem zu modellieren, brauchst du den tatsächlichen physikalischen Raum zwischen den Komponenten. Viele versuchen, einen dreidimensionalen Abstand nur mit Rektaszension und Deklination zu berechnen. Das funktioniert nicht. Um die dreidimensionale Separation-Methode zu verwenden, musst du beim Erstellen des Coordinate-Objects einen Distance-Parameter angeben. Du übergibst einen Distance-Wert mit einer physikalischen Unit, wie Parsec, zusammen mit deinen Winkelkoordinaten. Sobald beide Objects diese Distance-Daten enthalten, rufst du die dreidimensionale Separation-Methode auf der ersten Koordinate auf und übergibst die zweite Koordinate als Argument. Astropy gibt die direkte physikalische Linie zwischen ihnen im dreidimensionalen Raum zurück und übernimmt automatisch die Hintergrund-Trigonometrie. Nun, diese Objects sind nicht statisch. Um ihre Bewegung im Zeitverlauf zu modellieren, hängst du Velocity-Daten direkt bei der Erstellung an das Coordinate-Object an. Das machst du, indem du Proper-Motion-Parameter übergibst. Genauer gesagt übergibst du die Proper Motion in Rektaszension und die Proper Motion in Deklination. Diese erfordern Winkel-Units pro Zeit, wie Millibogensekunden pro Jahr. Du übergibst auch einen Radial-Velocity-Parameter, der eine physikalische Geschwindigkeit wie Kilometer pro Sekunde annimmt. Wenn du diese zusammenfasst, wird das Coordinate-Object zu einem vollständigen Phasenraum-Vektor. Es speichert die aktuelle Position des Objects und den genauen Vektor, wohin es sich bewegt. Hier ist der entscheidende Punkt: Auch dein Teleskop bewegt sich durch den Raum. Die Erde dreht sich um ihre Achse und umkreist die Sonne. Wenn du die Radialgeschwindigkeit eines Sterns vom Boden aus misst, ist deine Rohmessung durch die Eigengeschwindigkeit der Erde in genau diesem Moment verfälscht. Um deine Daten mit anderen Astronomen zu teilen, musst du die Erdbewegung herausrechnen. Du verschiebst deinen Bezugspunkt auf ein stabiles Frame, normalerweise den Massenschwerpunkt des Sonnensystems. Das nennt man die baryzentrische Radial-Velocity-Correction. Um diese Correction in Astropy zu berechnen, musst du mit einem EarthLocation-Object definieren, wo sich der Beobachter befindet. Das erstellst du, indem du die genaue Longitude, Latitude und Elevation deines Instruments übergibst. Alternativ kannst du eine etablierte Site direkt aus der integrierten Site-Registry von Astropy abrufen, indem du einen bekannten Namen wie das Keck-Observatorium abfragst. Als Nächstes brauchst du die genaue Time, zu der die Beobachtung stattfand. Wenn deine Location und Time bereit sind, rufst du die Radial-Velocity-Correction-Methode direkt auf dem Coordinate-Object deines Targets auf. Du übergibst ihr die Beobachtungszeit und deine EarthLocation. Astropy berechnet den Velocity-Vektor des Keck-Observatoriums in dieser spezifischen Millisekunde relativ zum Target und gibt den Velocity-Offset zurück. Diesen Correction-Wert addierst du zu deiner gemessenen rohen Radialgeschwindigkeit. Das Ergebnis ist eine saubere, standardisierte Messung, bezogen auf das Baryzentrum des Sonnensystems. Das Wichtigste, was du hier mitnehmen solltest, ist, dass eine Koordinate nicht einfach nur ein fester Punkt auf einer Karte ist. Sie ist ein vollständiges kinematisches Modell, das die Position des Targets, seine Flugbahn und die Geometrie enthält, die nötig ist, um deine eigene Bewegung zu korrigieren. Danke fürs Zuhören. Passt auf euch auf!
5

Meisterung tabellarischer Daten: Die QTable-Klasse

4m 06s

Entdecken Sie, warum Astropy eine eigene QTable-Klasse hat, anstatt sich rein auf Pandas zu verlassen. Lernen Sie, wie man mehrdimensionale Spalten, Quantities und Mixins speichert.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für die Astronomie, Folge 5 von 15. Pandas ist fantastisch für flache Daten, aber was passiert, wenn eine einzelne Spalte in deinem Dataset eine Zeitreihe, eine physikalische Einheit und eine räumliche Koordinate enthalten muss? Standard-Dataframes stoßen hier an ihre Grenzen. Um das zu lösen, brauchst du Tabular Data Mastery: Die QTable-Klasse. Wenn du mit Python arbeitest, kennst du Pandas bereits. Pandas geht von flachen Daten aus und bevorzugt einen einfachen Wert pro Zelle. In der Astronomie sind Daten jedoch selten einfach. Eine einzelne Beobachtung kann exakte Einheiten, eine Wertematrix oder eine komplexe Himmelskoordinate erfordern. Astropy bietet eine maßgeschneiderte tabellarische Datenstruktur, die speziell für diese Realität entwickelt wurde. Dir wird auffallen, dass Astropy sowohl eine Standard-Table-Klasse als auch eine QTable-Klasse hat. Die beiden werden oft verwechselt. Die Standard-Table speichert Unit-Informationen als Hintergrund-Metadaten, aber sie gibt plain NumPy-Arrays zurück, wenn du eine Spalte extrahierst. Eine QTable erzwingt strikte Unit-Awareness. Wenn du eine Spalte aus einer QTable abrufst, bekommst du garantiert ein natives Astropy Quantity-Objekt zurück. Die physikalische Einheit ist fest an die Zahlen gebunden. Lass uns Schritt für Schritt durchgehen, wie man eine QTable baut. Du fängst an, indem du QTable aus dem astropy dot table Modul importierst. Du kannst sie mit einem Dictionary erstellen, bei dem die Keys deine Spaltennamen und die Values deine Daten-Arrays sind. Angenommen, du erstellst einen einfachen Galaxienkatalog. Deine erste Spalte ist Plain Text. Du weist ihr eine Liste von Strings zu, die die Galaxiennamen repräsentieren. Jetzt musst du erfassen, wo sich diese Galaxien befinden. Du willst keine separaten, unzusammenhängenden Spalten für Rektaszension und Deklination. Stattdessen erstellst du ein Astropy SkyCoord-Objekt, das die Positionen all deiner Galaxien enthält. Du übergibst dieses einzelne SkyCoord-Objekt direkt als zweite Spalte in deine Tabelle. Das ist eine Mixin-Spalte. Mixins erlauben es komplexen Astropy-Typen wie SkyCoord- oder Time-Objekten, sich innerhalb der Tabelle genau wie Standard-Daten-Arrays zu verhalten. Du kannst die Tabellenzeilen slicen, sortieren und filtern, und das Mixin-Objekt hält seine internen Daten automatisch perfekt synchronisiert. Als Nächstes musst du Flux-Messungen über drei verschiedene Wellenlängenbänder für jede Galaxie speichern. In einem typischen Dataframe wärst du gezwungen, drei separate Spalten zu erstellen. In einer QTable verwendest du eine multidimensionale Spalte. Du definierst ein einzelnes Array mit einer Shape von N Zeilen und drei Spalten, hängst eine physikalische Flux-Unit an das Ganze an und weist es als deine dritte Tabellenspalte zu. Hier wird es interessant. Die QTable akzeptiert das multidimensionale Array nativ. Eine einzelne Zeile in dieser Spalte enthält jetzt ein vollständig in sich geschlossenes Array aus drei Unit-aware-Messungen. Wenn du diese Tabelle printest, formatiert Astropy sie sauber. Es richtet die nested Arrays aus und zeigt die Units direkt unter den Column-Headern an. Deine Metadaten und deine Messungen sind fest miteinander verbunden. Die QTable ist nicht einfach nur ein Spreadsheet; sie ist ein spezialisierter Container, der gebaut wurde, um die Physik und Geometrie deiner Daten zu respektieren. Danke fürs Dabeisein. Ich hoffe, du hast etwas Neues mitgenommen.
6

Erweiterte Tabellenoperationen: Masking und Joins

4m 09s

Bringen Sie Ihre QTable-Fähigkeiten auf die nächste Stufe, indem Sie fehlende Daten mit MaskedColumns handhaben und datenbankähnliche Joins ausführen.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für die Astronomie, Folge 6 von 15. Die Suche nach einer bestimmten Quelle in einem riesigen Katalog bedeutet normalerweise, einen vollständigen linearen Scan auszuführen, der viel Rechenzeit frisst. Aber wenn du deine Daten richtig strukturierst, kannst du diese Lookups von Minuten auf Millisekunden reduzieren. Genau darum geht es heute: Advanced Table Operations: Masking und Joins. Astropy-Tabellen sind nicht einfach nur Arrays. Sie verhalten sich wie eine relationale In-Memory-Datenbank, die physikalische Einheiten nativ versteht. Angenommen, du hast einen photometrischen und einen spektroskopischen Katalog und musst sie anhand einer gemeinsamen Source ID kombinieren. Bevor du sie mergest, musst du fehlende Daten behandeln. Dein photometrischer Katalog hat wahrscheinlich fehlende Magnitude-Werte, weil eine Beobachtung fehlgeschlagen ist oder ein Sensor einen Frame gedroppt hat. Du könntest versuchen, diese fehlenden Werte mit Standard-Numpy-Boolean-Arrays herauszufiltern. Mach das nicht. Standard-Numpy-Masks, die direkt auf eine Unit-aware Table angewendet werden, entfernen stillschweigend deine physikalischen Units und breaken Mixin-Objekte. Stattdessen löst Astropy das mit der MaskedColumn. Wenn du innerhalb einer QTable arbeitest – das ist die Unit-aware Table-Klasse –, nutzt Astropy unter der Haube automatisch MaskedColumn-Operationen für fehlende Daten. Das stellt sicher, dass deine Magnitude-Spalte ihre physikalischen Units behält, während die fehlenden Einträge sicher markiert werden, damit sie deine Downstream-Berechnungen nicht verfälschen. Wenn dein sauber maskierter photometrischer Katalog bereit ist, wird es Zeit, ihn mit deinen spektroskopischen Daten zu kombinieren. Astropy bietet eine Join-Funktion, die ähnlich wie eine relationale Datenbank funktioniert. Du übergibst der Funktion deine linke Tabelle, deine rechte Tabelle und gibst den gemeinsamen Spaltennamen als Key an, was in diesem Fall deine Source ID ist. Wenn du einen Inner Join angibst, wertet die Funktion beide Datensätze aus und gibt eine neue Tabelle zurück, die nur die Rows enthält, in denen die Source ID in beiden Katalogen existiert. Hier ist der entscheidende Punkt: Weil du QTable-Objekte verwendest, gleicht die Join-Operation die Units beider Seiten automatisch ab und behält sie bei. Deine gemergte Tabelle enthält die präzisen physikalischen Parameter aus den spektroskopischen Daten zusammen mit den korrekt maskierten Magnitudes aus den photometrischen Daten – perfekt aligned. Jetzt hast du einen gemergten Katalog, und für deine Analyse musst du die exakten Parameter für eine bestimmte Source ID abrufen. Ohne weiteres Zutun erfordert das Finden einer Row in einer riesigen Tabelle, jeden einzelnen Eintrag sequenziell zu überprüfen. Astropy löst diesen Performance-Bottleneck mit Table Indexing. Du kannst die Tabelle anweisen, einen Index für deine Source ID-Spalte zu erstellen. Hinter den Kulissen baut Astropy eine B-Tree-Datenstruktur auf, die deine Source IDs direkt auf ihre zugrunde liegenden Row Locations im Memory mappt. Sobald der Index gebaut ist, rufst du deine Daten über die Table Location Property ab und übergibst deine Target ID. Die Engine traversiert den B-Tree, überspringt den Full Scan komplett und holt deine Row in logarithmischer Zeit. Du kannst sogar mehrere Spalten gleichzeitig indexieren, um komplexe Lookups zu handhaben, wie zum Beispiel das Finden einer Row anhand von Source ID und Beobachtungsdatum. Das Bauen eines Index kostet vorab nur einen Bruchteil an Compute Time, aber es zahlt sich sofort aus, wenn du wiederholte Lookups über riesige Datensätze ausführen musst. Die wahre Stärke von Astropy-Tabellen ist nicht nur das Speichern von Daten, sondern das Beibehalten der physikalischen Integrität deiner Units über komplexe relationale Joins und High-Speed B-Tree Queries hinweg. Das war’s für diese Folge. Danke fürs Zuhören und keep building!
7

Das Unified I/O Interface

4m 02s

Lernen Sie, wie Astropy das Lesen und Schreiben von Dateien in einer einzigen einheitlichen Schnittstelle abstrahiert. Wir behandeln den nahtlosen Umgang mit FITS-Tabellen, VOTables und ASCII-Formaten.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 7 von 15. Du hast eine alte, unübersichtliche Textdatei mit Sternkoordinaten und musst sie in einen modernen, komprimierten Binary Standard konvertieren. In den meisten Libraries bedeutet das, einen eigenen Parser zu schreiben, Datentypen zu mappen und mit Binary Serializern zu kämpfen. In Astropy schaffst du das mit genau zwei Zeilen Code. Das ist dem Unified I/O Interface zu verdanken. Das Unified I/O Interface ist ein polymorpher Data Handling Layer. Anstatt dich zu zwingen, für jeden Dateityp ein bestimmtes Modul zu importieren, stellt Astropy eine generische read- und write-Methode direkt für seine Core Data Structures bereit. Ob du mit einem Standard Table, einem QTable mit physikalischen Einheiten oder einem mehrdimensionalen NDData Array arbeitest – das Interaktionsmodell bleibt über völlig unterschiedliche Dateistandards hinweg identisch. Es gibt ein weit verbreitetes Missverständnis bezüglich der Datenextraktion. Wenn Developer eine FITS-Datei lesen müssen, greifen sie oft direkt auf das Low-Level-Modul astropy dot io dot fits zurück. Dieses Modul dient ausschließlich der Raw File Manipulation, beispielsweise dem Bearbeiten einzelner Header Cards oder dem Untersuchen unformatierter Byte Streams. Wenn du lediglich tabellarische Daten aus einer FITS-Datei extrahieren möchtest, solltest du es nicht verwenden. Nutze stattdessen die Table dot read Methode. Diese umgeht die manuelle Header-Extraktion und übernimmt das zugrundeliegende Data Mapping automatisch. Wenn du die read-Methode aufrufst und einen Dateipfad oder ein offenes File Object übergibst, verlässt sich Astropy auf eine robuste Format Inference Engine. Zunächst wird die File Extension geprüft. Wenn du einen String übergibst, der auf dot h5 oder dot parquet endet, leitet sie die Anfrage an den entsprechenden spezialisierten Parser weiter. Ist die Extension mehrdeutig, fehlt sie oder handelt es sich nur um eine generische Text-Extension, geht die Engine ein Level tiefer und prüft den Dateiinhalt. Sie liest die ersten Bytes der Daten und sucht nach bekannten Signaturen oder Magic Numbers, um den Standard zuverlässig zu identifizieren. Wenn die automatische Inferenz komplett fehlschlägt, umgehst du sie, indem du einen Format Argument String wie ascii dot csv übergibst, um den korrekten Parser zu erzwingen. So funktioniert das in unserem Ausgangsszenario: Du hast diese alte ASCII Text Table mit Sternkoordinaten. Du rufst QTable dot read auf und übergibst den Pfad zu deiner Textdatei. Astropy erkennt das ASCII-Format, parst die Spalten und gibt ein vollständig gefülltes QTable Object im Arbeitsspeicher zurück. Als Nächstes möchtest du diese als komprimierte FITS Binary Table speichern. Du nimmst dasselbe QTable Object im Arbeitsspeicher und rufst seine write-Methode auf. Du gibst einen neuen Dateinamen an, der auf dot fits endet, und übergibst einen zusätzlichen Parameter, um die Komprimierung zu aktivieren. Außerdem musst du ein overwrite Flag auf true setzen, da die write-Methode bestehende Dateien standardmäßig sicher schützt. Hier wird es interessant: Astropy wechselt im Hintergrund dynamisch den Kontext vom Plain Text Parsing zur komplexen Binary Serialization. Die zugrunde liegenden File Protocols sind völlig unterschiedlich, aber das Interface, das du verwendest, bleibt unverändert. Da das Interface an die Datenstruktur und nicht an das Dateiformat gebunden ist, werden deine Data Processing Pipelines von deinen Speichermedien entkoppelt. Der wichtigste Takeaway hierbei ist, dass du für die Änderung, wie deine Anwendung Daten speichert und teilt, lediglich eine File Extension in einem einzigen String anpassen musst, anstatt deine gesamte Data Ingestion Pipeline neu zu schreiben. Das war’s für heute. Vielen Dank fürs Zuhören – bau etwas Cooles.
8

FITS-Header und HDUs entmystifiziert

4m 03s

Tauchen Sie in das rohe astropy.io.fits-Modul ein, um Header Data Units (HDUs) zu manipulieren. Lernen Sie, wie man nicht standardmäßige FITS-Header parst, bearbeitet und repariert.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 8 von 15. Der FITS-Dateistandard wurde in den 1980er-Jahren für Fortran-Systeme entwickelt und speichert Metadaten in starren 80-Byte-Blöcken, die direkt physischen Lochkarten nachempfunden sind. Die Arbeit mit Lochkartenstrukturen in modernem Code ist selten angenehm. Astropy verbirgt diese Komplexität, indem es diese Blöcke in native Strukturen übersetzt. Genau deshalb konzentriert sich diese Folge auf die Entmystifizierung von FITS-Headern und HDUs. Stell dir eine FITS-Datei als Container vor. In diesem Container befinden sich Header Data Units, allgemein bekannt als HDUs. Jede FITS-Datei muss mindestens eine davon enthalten, die Primary HDU genannt wird. Oft enthält diese primäre Einheit nur Metadaten, während die eigentlichen Bilder oder Binärtabellen direkt dahinter als Extension HDUs folgen. Wenn du eine FITS-Datei mit Astropy öffnest, parst es diesen Container und gibt dir ein HDUList-Objekt zurück. Du navigierst in diesem Objekt mit der Standard-Klammernotation, um einzelne HDUs auszuwählen. Hier ist der entscheidende Punkt zum Indexing. Der offizielle FITS-Standard verwendet aufgrund seiner Fortran-Wurzeln strikt ein 1-basiertes Indexing. Da Astropy jedoch eine Python-Library ist, erzwingt es ein 0-basiertes Indexing. Die Primary HDU befindet sich immer an Index null, und die erste Extension an Index eins. Das ist ein simples Detail, aber wenn man es vergisst, führt das ständig zu Off-by-One-Errors. Jedes HDU-Objekt enthält ein Header-Attribut. Hier stecken diese alten 80-Byte-Blöcke. In der FITS-Terminologie wird jede Metadatenzeile als Card bezeichnet. Eine komplette Card enthält ein Keyword, einen Value und manchmal einen beschreibenden Kommentar. Astropy verarbeitet diese Cards und stellt dir den Header als Objekt zur Verfügung, das sich exakt wie ein Standard-Python-Dictionary verhält. Wenn du die Belichtungszeit brauchst, übergibst du einfach das Keyword EXPTIME an den Header. Das Ändern von Values funktioniert genauso. Du weist dem Keyword mit einem Gleichheitszeichen einen neuen Value zu. Wenn du auch den Kommentar auf dieser bestimmten Card updaten musst, weist du ein Tuple zu, das sowohl den neuen Value als auch den neuen Comment-String enthält. Astropy packt diese Daten im Hintergrund automatisch wieder in den erforderlichen 80-Byte-Standard. Diese Übersetzung funktioniert reibungslos, bis du auf Legacy-Daten stößt. Ältere FITS-Dateien verstoßen häufig gegen den strengen Standard. Sie könnten Keywords haben, die zu lang sind oder ungültige Zeichen enthalten. Da Astropy die Header by default streng validiert, wirft der Versuch, eine nicht konforme Datei zu öffnen, oft sofort eine Exception. Anstatt die Datei aufzugeben, kannst du das mit der verify-Methode handhaben. Angenommen, du öffnest ein altes Teleskopbild und stößt auf einen Validation-Error wegen der Formatierung. Du nimmst das File-Objekt und rufst seine verify-Methode auf, wobei du das String-Argument fix übergibst. Astropy scannt alle Header-Cards, repariert Formatierungsprobleme wo möglich automatisch und unterdrückt Errors für die beschädigten Felder, die es fixt. Sobald der Header stabilisiert ist, kannst du eine kaputte OBSERVER-Card sicher mit dem korrekten String updaten und deine bereinigte HDUList dann wieder auf die Disk schreiben. Behandle deine FITS-Metadaten-Updates immer als einfache Dictionary-Operationen, aber halte diese verify-Methode bereit für den Moment, in dem Legacy-Daten die Regeln brechen. Wenn du dabei helfen möchtest, die Show am Laufen zu halten, such auf Patreon nach DevStoriesEU. Danke fürs Einschalten. Bis zum nächsten Mal!
9

Umgang mit riesigen FITS-Dateien und Cloud-Speicher

4m 08s

Lernen Sie, wie Sie riesige FITS-Datensätze, die nicht in den RAM passen, mithilfe von Memory Mapping (memmap) handhaben, und entdecken Sie, wie Sie Ausschnitte aus Cloud-Buckets mit fsspec streamen.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 9 von 15. Du brauchst keinen Supercomputer, um ein hundert Gigabyte großes Image zu analysieren. Du brauchst nur einen Weg, dein Betriebssystem auszutricksen, damit es genau nur die Pixel liest, die dich interessieren. Handling Massive FITS Files and Cloud Storage ist genau der Mechanismus, den du dafür nutzt. Wenn du mit riesigen astronomischen Arrays arbeitest, stürzt dein Prozess sofort ab, wenn du versuchst, ein komplettes File in den Memory zu laden. Astropy vermeidet das durch ein Feature namens Memory Mapping. Wenn du ein FITS-File öffnest, kannst du ein Argument namens memmap übergeben und auf True setzen. Eine Memory Map liest die Image-Data nicht in deinen physischen RAM. Stattdessen mappt sie das File auf deiner Festplatte direkt in den virtuellen Memory Address Space deines Computers. Wenn du auf einen bestimmten Slice des Arrays zugreifst, holt sich dein Betriebssystem nur genau diesen Datenblock von der Disk. Du hast den Komfort, so zu tun, als wäre das gesamte File geladen, aber du zahlst die physischen Memory-Kosten nur für die Pixel, die du aktiv verarbeitest. Dieses Verhalten bringt eine sehr häufige Falle mit sich. Du öffnest vielleicht ein FITS-File, weist das Image-Array einer Variable zu und rufst dann close auf dem File-Objekt auf. Du erwartest, dass das File Handle und die Resource freigegeben werden. Werden sie aber nicht. Weil Memory Maps darauf basieren, dass das Betriebssystem das File mit einer Variable verlinkt, bleibt das File offen und gelockt, solange irgendeine Reference auf dieses Array in deiner Python Session existiert. Um die Resource wirklich freizugeben und das File Handle komplett zu schließen, musst du deine Data-Variable explizit mit dem Standard-Python-Befehl delete löschen. Das deckt lokale Files ab, aber moderne Astronomie-Datasets liegen oft auf Remote-Servern. Hunderte von Gigabyte herunterzuladen, nur um eine kleine Region zu inspizieren, ist reine Verschwendung von Bandwidth und Zeit. Astropy verarbeitet Remote-Data durch die Integration mit der file system spec Library. Wenn du ein File öffnest, übergibst du ein Argument namens use fsspec, das auf True gesetzt ist. Das sagt der Library, dass sie Cloud Storage Locations genau wie lokale Laufwerke behandeln soll. Stell dir ein zweihundert Megabyte großes Hubble Space Telescope Image vor, das in einem öffentlichen Amazon S3 Bucket gehostet wird. Du willst nur einen winzigen zehn mal zwanzig Pixel großen Ausschnitt rund um einen bestimmten Stern. Zuerst rufst du fits open auf und übergibst den S3 Uniform Resource Identifier anstelle eines lokalen File Paths, zusammen mit use fsspec auf True. Astropy verbindet sich mit dem Bucket und lädt nur die FITS Header Blocks herunter. Dadurch versteht es die Struktur des Files, ohne die eigentlichen Image-Data anzufassen. Als Nächstes navigierst du zur richtigen Image Extension und slicest das Data-Array mit Standard-Indexing, um dir genau deinen zehn mal zwanzig Block zu schnappen. Hier wird es interessant. Astropy übersetzt diesen Array Slice in spezifische HTTP Byte Range Requests. Deine Maschine kontaktiert Amazon S3, fragt nur nach den physischen Bytes, die diesen zweihundert Pixeln entsprechen, und lädt exakt diesen winzigen Chunk herunter. Du bekommst deinen Ausschnitt sofort, während die restlichen hundertneunundneunzig Megabyte des Files unberührt auf dem Server bleiben. Die Kombination aus lokalem Memory Mapping und Remote Byte Range Streaming bedeutet, dass deine Analysis Scripts nur durch die Daten limitiert werden, die du aktiv berechnest, und niemals durch die Gesamtgröße des Files selbst. Ich möchte mir kurz einen Moment nehmen, um dir fürs Zuhören zu danken – das hilft uns sehr. Hab einen schönen Tag!
10

Gerasterte Daten: Die NDData- und CCDData-Klassen

4m 09s

Steigen Sie von rohen numpy-Arrays auf CCDData um. Lernen Sie, wie Sie 2D-Bilddaten mit Masken, WCS-Metadaten und robusten physikalischen Unsicherheiten bündeln.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 10 von 15. Wenn du ein normales numerisches Array slicest, bekommst du nur rohe Pixel heraus. Aber Teleskopdaten sind nie einfach nur eine Zahlenmatrix. Wenn du ein Bild croppst, um dir einen einzelnen Stern anzusehen, müssen deine Error Bounds, deine Dead Pixel Masks und deine Himmelskoordinaten perfekt aligned bleiben, sonst bricht deine gesamte Analyse zusammen. Genau deshalb verwenden wir Gridded Data: die NDData- und CCDData-Classes. Im Kern bietet Astropy die Base Class NDData als Standard-Container für astronomische Gridded Data. Während NDData die allgemeine Struktur übernimmt, nutzt du für echte optische oder Infrarotbilder normalerweise die spezialisierte Subclass namens CCDData. Dieser Container existiert, um deine rohen Pixelwerte direkt mit ihren physikalischen Eigenschaften zu verknüpfen. Lass uns mal durchgehen, wie du ein CCDData-Objekt für eine rohe Teleskopbelichtung initialisierst. Du übergibst nicht einfach ein zweidimensionales Grid aus Zahlen. Du übergibst das rohe Data Grid und musst eine physikalische Unit zuweisen, wie zum Beispiel Elektronen oder Analog-to-Digital Units. Als Nächstes hängst du eine Boolean Mask an. Wenn während der Belichtung ein hochenergetischer kosmischer Strahl deinen Detektor trifft, flaggst du diese spezifischen, ruinierten Pixel in einem separaten Mask Array als True, und übergibst das direkt an das CCDData-Objekt. Dann kommt das Error Tracking. Du hängst ein Uncertainty Array an. Für unser rohes Image könntest du das Poisson Noise berechnen und es entweder über die Standard Deviation Uncertainty Class oder die Variance Uncertainty Class anhängen. Jetzt sind deine Helligkeitswerte, deine Units, deine Bad Pixel Flags und deine statistischen Noise Limits als ein vereintes Objekt fest miteinander verbunden. Das bringt uns zu einem häufigen Missverständnis. Sobald du dieses voll bepackte Objekt hast, versuche nicht, mathematische Standardoperatoren wie ein einfaches Plus- oder Minuszeichen zu verwenden, um das Bild zu verarbeiten. Wenn du normale Array-Arithmetik versuchst, um einen Dark Background Frame zu subtrahieren, lässt du deine Uncertainties auf der Strecke. Stattdessen musst du die Built-in Arithmetic Methods der Klasse nutzen, wie die add, subtract, multiply und divide Functions. Hier wird es interessant. Wenn du die subtract-Methode aufrufst, subtrahiert Astropy nicht einfach nur die Pixelwerte. Es propagiert deine Variance Uncertainties automatisch durch die Operation, indem es statistische Standardregeln anwendet, was ein mathematisch sauberes Noise-Profil im resultierenden Bild liefert. Später in deinem Workflow stellst du vielleicht fest, dass dein komplettes Teleskopbild zu groß ist und du nur eine einzelne Galaxie oben rechts analysieren willst. Das erreichst du mit einem Tool namens Cutout2D. Du übergibst dein Haupt-CCDData-Objekt, die genauen Center-Koordinaten deiner Zielgalaxie und die Bounding Box Size, die du extrahieren möchtest. Weil du alles in einem CCDData-Container verpackt hast, übernimmt Cutout2D das komplexe Syncing automatisch. Es gibt ein neues, kleineres Objekt zurück. Es slicet die Image-Pixel, aber es croppt auch automatisch die Cosmic Ray Mask und das Variance Uncertainty Array auf exakt dieselben Dimensionen. Ganz wichtig: Es übersetzt das zugrundeliegende World Coordinate System. Die Pixelkoordinate Null-Null in deinem neuen Cutout mappt korrekt auf exakt dieselbe Rektaszension und Deklination wie im Master Image. Indem die Pixel Data, die physikalischen Error Margins und die räumlichen Koordinaten als eine unteilbare Einheit behandelt werden, verhindern diese Classes eine stille Data Corruption, während dein Bild durch komplexe Analysis Pipelines läuft. Das war's für diese Folge. Danke fürs Zuhören und keep building!
11

World Coordinate Systems: Pixel auf den Himmel abbilden

4m 31s

Übersetzen Sie Kamerapixel mithilfe des WCS-Pakets in Himmelskoordinaten. Verstehen Sie die High-Level-API und die Mathematik hinter FITS-Projektionen.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für die Astronomie, Folge 11 von 15. Jedes Pixel auf einem Teleskopdetektor ist ein flaches, diskretes Quadrat, der Himmel hingegen eine kontinuierliche, mathematisch komplexe, gekrümmte Kugel. Die Zuordnung eines Punktes auf diesem flachen Detektor zu seiner wahren Position im Universum ist ein kniffliges geometrisches Problem. World Coordinate Systems, oder WCS, sind der Mechanismus, der diese Geometrie entschlüsselt. WCS fungiert als die ultimative Brücke zwischen Hardware und Physik. Es liefert die mathematische Transformation, die erforderlich ist, um eine Pixelkoordinate in eine World Coordinate umzuwandeln, wie zum Beispiel Rektaszension und Deklination. In astronomischen Daten werden diese Transformationsregeln üblicherweise als standardisierte Metadaten im Header einer FITS-Datei gespeichert. Der Header enthält spezifische Keywords, die das Reference Pixel, die physikalischen Koordinaten dieses Pixels und die vom Teleskop verwendete Rotations- oder Skalierungsmatrix definieren. Astropy liest diese Keywords und erstellt ein aktives Transformation Object, das die gesamte Brennebene modelliert. Bevor wir mit den Berechnungen beginnen, müssen wir eine ständige Ursache für Verwirrung bei der Indizierung klären. Der FITS-Standard definiert Pixelkoordinaten als one-indexed, das heißt, das allererste Pixel auf dem Detektor ist Pixel eins. Python, und damit auch NumPy, ist zero-indexed. Astropy löst diese Dualität durch zwei verschiedene Ebenen. Die ältere Low-Level-API ist kein einheitliches Indizierungssystem; sie erfordert, dass du bei jeder Koordinatenumwandlung explizit ein Origin-Argument von null oder eins übergibst. Aber das moderne, High-Level Shared Python Interface arbeitet vollständig mit der zero-indexed Konvention von Python. Es erwartet zero-based Pixel von dir und handhabt den Offset zum FITS-Standard intern automatisch. Hier ist die entscheidende Erkenntnis. Die High-Level-API macht die Koordinatenumrechnung unglaublich kompakt. Angenommen, du hast in deinem Image Array einen hellen Stern bei den Pixeln x gleich 30 und y gleich 40 gefunden und musst seine tatsächliche Position im Raum bestimmen. Zuerst liest du deinen FITS-Datei-Header mithilfe der Input-Output-Tools von Astropy. Als Nächstes initialisierst du ein WCS-Objekt, indem du diesen Header direkt an die WCS-Klasse übergibst. Schließlich rufst du eine Methode namens pixel to world auf diesem WCS-Objekt auf und übergibst deine x- und y-Pixelwerte von 30 und 40. Die Methode berechnet die Projektionsmathematik und gibt ein standardmäßiges Astropy SkyCoord-Objekt zurück. Dieses Objekt enthält die physikalischen Koordinaten und ist sich seines Reference Frames, wie zum Beispiel ICRS, vollständig bewusst. Das Schöne an diesem Shared Interface ist, dass es dich vor rohen Zahlen schützt. Anstatt ein generisches Array von Floats zurückzugeben, das abstrakte Gradwerte repräsentiert, gibt es dir aussagekräftige Objekte, die ihre eigenen physikalischen Einheiten und Koordinatensysteme verstehen. Du kannst dieses SkyCoord nehmen und es sofort verwenden, um es mit einem Sternkatalog abzugleichen. Das System funktioniert genauso in umgekehrter Richtung. Wenn du die Koordinaten einer bekannten Galaxie hast und genau bestimmen möchtest, welche Pixel sie auf deinem Kamerasensor belegt, rufst du die Methode world to pixel auf deinem WCS-Objekt auf. Du übergibst dein SkyCoord, und es gibt die exakten x- und y-Floating-Point-Pixelpositionen zurück. Die High-Level-WCS-API isoliert deine Application Logic von der zugrundeliegenden Projektionsmathematik. Das bedeutet, dass dein Pixel-to-Sky-Conversion-Code identisch bleibt, egal ob du mit einer flachen Radio Map oder einem stark verzerrten optischen Weitfeldmosaik arbeitest. Das war’s für diese Folge. Vielen Dank fürs Zuhören und keep building!
12

Analytische Modelle und Fitting

4m 03s

Tauchen Sie in das astropy.modeling-Modul ein. Lernen Sie, wie man 1D- und 2D-Modelle erstellt, Parameterbeschränkungen anwendet und lineare oder nichtlineare Fitter ausführt.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für die Astronomie, Folge 12 von 15. In vielen wissenschaftlichen Libraries ist die mathematische Gleichung, die du evaluieren willst, eng mit dem Optimierungsalgorithmus gekoppelt. Wenn du ändern willst, wie die Optimierung funktioniert, musst du oft die Art und Weise umschreiben, wie du deine Mathematik definiert hast. Astropy eliminiert dieses Problem komplett mit seinem Ansatz für Analytical Models und Fitting. Die zentrale Designphilosophie des Astropy Modeling-Subpackages ist eine strikte Separation of Concerns. Die mathematische Definition deiner Gleichung ist ein Objekt. Die algorithmische Engine, die diese Gleichung an deine Daten fittet, ist ein komplett separates Objekt. Das bedeutet, du kannst deine Mathematik einmal definieren und sie dann gegen verschiedene Fitting-Algorithmen testen, indem du das Model einfach an einen anderen Fitter übergibst. Astropy bietet Dutzende vordefinierter mathematischer Models. Wenn du einen stetigen Trend modellierst, benutzt du ein Linear1D-Model. Wenn du eine Emissionslinie in einem Spektrum untersuchst, greifst du zu einem Gaussian1D-Model. Diese Model-Objekte kapseln ihre Parameter, wie die Amplitude, den Mean und die Standardabweichung. Bevor wir uns den Fitting-Prozess ansehen, müssen wir eine häufige Quelle der Verwirrung ansprechen. In Astropy sind Models Callable Objects. Du übergibst ein Array von Koordinaten direkt an ein instanziiertes Model, und es evaluiert die Mathematik, um die entsprechenden Werte zurückzugeben. Besonders wichtig: Wenn du ein Model optimierst, mutiert der Fitter dein ursprüngliches Start-Objekt nicht. Er gibt immer eine brandneue, gefittete Model-Instanz zurück. Deine ursprüngliche Schätzung bleibt exakt so erhalten, wie du sie definiert hast. Stell dir ein Szenario vor, in dem du verrauschte, eindimensionale Array-Daten hast, die ein Spektralmerkmal darstellen. Zuerst initialisierst du ein Gaussian1D-Model mit deinen groben Anfangsschätzungen für die Amplitude, den Mean und die Breite. Da Astropy die Mathematik vom Optimizer trennt, hängst du deine physikalischen Constraints direkt an die Model-Parameter an. Angenommen, du kennst bereits die exakte Mittelkoordinate dieser Spektrallinie. Du greifst auf den Mean-Parameter deines Models zu und setzt seine fixed-Property auf true. Der Optimierungsalgorithmus wird diesen Wert nun in Ruhe lassen. Du kannst auch mathematische Boundaries festlegen. Indem du eine Minimum-Bound von Null für den Amplituden-Parameter setzt, zwingst du den Algorithmus, alle Lösungen zu verwerfen, die zu einem negativen Peak führen. Wenn dein Start-Model vollständig constrained ist, holst du den Fitter dazu. Für nichtlineare Gleichungen wie eine Gaussian instanziierst du den Levenberg-Marquardt Least Squares Fitter, in Astropy als LevMarLSQFitter bekannt. Du führst den Fit aus, indem du dieses Fitter-Objekt aufrufst und dein initiales Gaussian-Model zusammen mit deinen horizontalen und vertikalen Daten-Arrays übergibst. Der Algorithmus läuft und gibt ein komplett neues Gaussian1D-Model aus, das die optimierten Parameterwerte enthält. Da dieses neue Model direkt callable ist, übergibst du ihm einfach dein ursprüngliches horizontales Array, um eine glatte mathematische Kurve zu generieren, die du gegen deine verrauschten Daten plotten kannst. Hier ist der entscheidende Punkt. Indem die Constraints im Model gespeichert werden, anstatt sie an den Solver zu übergeben, bleiben die Fitting-Algorithmen generisch. Du konzentrierst dich darauf, die physikalische Realität deines Problems in das mathematische Model zu codieren, sodass Astropy die Optimierungslogik im Hintergrund austauschen kann, ohne deine Pipeline zu breaken. Das war’s für diese Folge. Danke fürs Zuhören und keep building!
13

Compound Models und benutzerdefinierte Fits

3m 54s

Erweitern Sie Ihr Modellierungs-Toolkit, indem Sie mehrere mathematische Modelle kombinieren und Ihre eigenen benutzerdefinierten Fitter und einheitenbewussten Modelle definieren.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für die Astronomie, Folge 13 von 15. Anstatt mühsam eine riesige mathematische Funktion mit fünfzehn Parametern von Hand zu schreiben, um ein unübersichtliches Spektrum zu fitten, was wäre, wenn du einfach grundlegende Formen wie Legosteine zusammensetzen und Python die Mathe erledigen lassen könntest? Genau darum geht es heute mit Compound Models und Custom Fits. In Astropy musst du nur selten komplexe analytische Modelle from scratch bauen. Du nimmst einfache, vordefinierte Blöcke und kombinierst sie mit Standard-Python-Arithmetikoperatoren wie Addition, Subtraktion, Multiplikation oder Division. Wenn du zwei Astropy-Models addierst, bekommst du kein statisches Array aus evaluierten Zahlen. Du bekommst ein brandneues, voll funktionsfähiges Model-Objekt. Diese Compound-Struktur weiß, wie sie sich selbst evaluiert, ihre Ableitungen berechnet und jeden Parameter der ursprünglichen Base Models trackt. Stell dir ein konkretes Szenario vor. Du hast ein Spektrum mit zwei deutlich getrennten Emissionslinien, die auf einem flachen Hintergrundkontinuum liegen. Du willst diese gesamte Struktur gleichzeitig fitten. Du fängst damit an, ein einfaches Polynomial Model zu instanziieren, das als deine flache Baseline dient. Als Nächstes instanziierst du zwei separate eindimensionale Gaussian Models, um die beiden Emissionslinien darzustellen. Um dein finales Spektralprofil zu erstellen, definierst du einfach eine neue Variable, die gleich dem Polynom plus dem ersten Gaussian plus dem zweiten Gaussian ist. Astropy führt sie automatisch zu einem einzigen Compound Evaluation Tree zusammen. Das führt zu einer typischen Falle beim Parameter-Zugriff. Wenn du dieses Compound Model erstellst, fragst du dich vielleicht, wie du die Amplitude der zweiten Emissionslinie isolieren kannst. Da beide Gaussians sind, haben beide einen Parameter namens amplitude. Astropy löst diese Kollision, indem es automatisch numerische Suffixe anhängt, basierend auf der Reihenfolge, in der die Models kombiniert wurden. Beim ersten Gaussian werden die Parameter in amplitude null, mean null und standard deviation null umbenannt. Der zweite Gaussian bekommt amplitude eins, mean eins und so weiter. Falls du jemals den Überblick verlierst, welcher Parameter zu welcher Komponente gehört, kannst du das parameter names Attribut deines Compound Models inspizieren, um die exakte generierte Liste zu sehen. Der zweite Teil davon ist das Fitten von Daten, die physikalische Einheiten haben. Astronomische Messungen sind nicht einfach nur raw Floats. Deine unabhängige Variable könnte die Wellenlänge in Angström sein, und deine abhängige Variable die Flussdichte in Jansky. Astropy Models handhaben das elegant über das Quantity-Objekt. Wenn du deine Data Arrays an einen Fitter übergibst, übergibst du die Astropy Quantity-Objekte direkt, ohne die Einheiten vorher zu entfernen. Der Fitter analysiert die Einheiten deiner Input-Daten und die Struktur deines Compound Models. Er fängt Dimensionsfehler ab, bevor der Fit überhaupt beginnt. Sobald der Fit konvergiert, haben die Parameter des resultierenden Models automatisch die korrekten physikalischen Einheiten. Deine Gaussian Means aktualisieren sich auf Angström und deine Amplituden auf Jansky. Du musst keine Custom Conversion Logic schreiben oder Einheiten vor dem Fitten entfernen, nur um sie später wieder anzuhängen. Das Compound Model erzwingt die Dimensionskonsistenz während des gesamten Prozesses. Hier ist der entscheidende Punkt. Wenn du ein Pluszeichen zwischen zwei Models verwendest, chainst du nicht einfach nur Funktionen zusammen. Du konstruierst eine einzige, einheitliche Gleichung, die strikte Unit Awareness und Parameter Traceability von den Raw Data bis zum finalen Fit beibehält. Das war’s für diese Folge. Bis zum nächsten Mal!
14

Zeitreihenanalyse: Die Jagd nach Exoplaneten

4m 39s

Analysieren Sie periodische Daten mit dem astropy.timeseries-Modul. Wir gehen das Falten von Lichtkurven und das Entdecken von Perioden mit dem Box Least Squares-Algorithmus durch.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 14 von 15. Du hast vierzehntausend ungleichmäßig verteilte Teleskopaufnahmen eines Sterns. Irgendwo in diesem Rauschen versteckt sich ein Helligkeitsabfall von null Komma null eins Prozent, verursacht durch einen Exoplaneten, der genau davor vorbeizieht. Hier ist der genaue Algorithmus, um ihn zu finden. In dieser Folge geht es um Time Series Analysis und die Jagd nach Exoplaneten. Astropy übernimmt diesen Workflow mit der TimeSeries-Klasse. Bevor wir weitermachen, räumen wir mal mit einem häufigen Missverständnis auf. Eine TimeSeries ist keine komplett neue Datenstruktur mit eigenen Regeln. Sie ist einfach nur eine Subclass von QTable. Das heißt, jede Table-Manipulation-Method, Column-Operation und Masking-Technik, die du schon kennst, funktioniert weiterhin perfekt. Der einzige Unterschied ist, dass die erste Column strikt als Astropy Time Object erzwungen wird. Diese Strenge garantiert, dass deine Timestamps und deine Flux-Messungen perfekt synchron bleiben, egal ob deine Beobachtungen gleichmäßig verteilt oder komplett zufällig sind. Um mit der Jagd nach einem Exoplaneten zu beginnen, lädst du als Erstes eine Light Curve. Astropy bietet built-in Reader, mit denen du ein Kepler FITS-File direkt an die TimeSeries Read-Function übergeben kannst. Sie richtet automatisch die Time-Column ein und zieht die Lichtmessungen, meistens Flux genannt, mit rein. Kepler-Daten sind extrem dicht und enthalten manchmal Tausende von Data Points über ein paar Monate hinweg. Diese Raw Data enthält oft hochfrequentes Rauschen vom Raumfahrzeug oder von stellarer Aktivität. Du kannst das durch Downsampling via Aggregation glätten. Du definierst eine Time Bin Size, zum Beispiel zehn Minuten, und übergibst eine Aggregation Function wie den Mean. Astropy gruppiert die Timestamps in diese Bins und bildet den Durchschnitt vom Flux. Das reduziert die Größe des Datasets und unterdrückt zufälliges Rauschen, ohne das eigentliche Transit-Signal zu löschen. Jetzt hast du saubere Daten, aber die Exoplaneten-Transits sind irgendwo auf einer riesigen Timeline versteckt. Um den Planeten zu finden, brauchst du ein Periodogramm. Vielleicht kennst du das Lomb-Scargle-Periodogramm, das sich super eignet, um weiche, kontinuierliche Sinuswellen zu finden, wie das Licht von einem pulsierenden Stern. Aber ein Planet, der vor einem Stern vorbeizieht, erzeugt keine Sinuswelle. Er erzeugt eine flache Linie, einen plötzlichen Drop, einen flachen Boden und einen plötzlichen Anstieg. Das Signal ist eine Box. Wegen dieser Form benutzt du das Box Least Squares Periodogramm, kurz BLS. Du übergibst deine Time-Column und deine Flux-Column an die BLS-Function. Der Algorithmus wertet dann ein komplettes Grid an möglichen Orbital Periods aus und testet dabei vielleicht alles von einem Ein-Tages-Orbit bis zu einem Fünfzig-Tage-Orbit. Bei jeder getesteten Frequenz schiebt er eine mathematische Box über die Daten und versucht, die Tiefe und Dauer eines potenziellen planetaren Transits zu matchen. Er gibt ein Power Spectrum zurück, das zeigt, wie gut die Box bei jeder einzelnen Frequenz gepasst hat. Du extrahierst einfach die Period, die den höchsten Power Peak erzeugt hat. Das ist dein vermuteter Exoplaneten-Orbit. Sobald du diese genaue Period hast, musst du sie visuell verifizieren. Du nimmst deine ursprüngliche TimeSeries und rufst die Fold-Method auf, wobei du die gerade entdeckte Period übergibst. Das Folding nimmt jede einzelne Beobachtung über Monate oder Jahre hinweg und mappt sie auf einen einzigen Orbital Cycle. Statt einer chronologischen Timeline wird deine horizontale Achse zur Phase, die von null bis eins reicht. Jedes Mal, wenn der Planet im Laufe der Mission vor dem Stern vorbeizog, werden diese einzelnen Data Points bei exakt derselben Phase übereinander gestapelt. Das ist der Teil, auf den es ankommt. Wenn du diese gefaltete TimeSeries plottest, verschwindet der zufällige Timeline-Scatter, und ein sauberer, unbestreitbarer U-förmiger Dip erscheint genau in der Mitte deines Graphen. Du hast gerade Geometrie und Zeit genutzt, um eine unsichtbare Welt aus dem Rauschen herauszuholen. Danke, dass du ein paar Minuten mit mir verbracht hast. Bis zum nächsten Mal, mach's gut.
15

Kosmologische Berechnungen: Das Universum vermessen

4m 06s

Führen Sie komplexe Berechnungen auf Universumsebene mit dem astropy.cosmology-Modul durch. Berechnen Sie Rückblickzeiten, Leuchtkraftentfernungen und finden Sie Rotverschiebungen basierend auf dem Alter.

Herunterladen
Hallo, hier ist Alex von DEV STORIES DOT EU. Astropy: Python für Astronomie, Folge 15 von 15. Die Metrik des expandierenden Universums zu lösen, erfordert normalerweise, massive elliptische Integrale von Hand auszuwerten. Oder du importierst einfach ein einzelnes Modul und lässt Python die Berechnungen erledigen. Heute schauen wir uns kosmologische Berechnungen an: Die Dimensionen des Universums. Das Astropy cosmology Subpackage kapselt die allgemeine Relativitätstheorie und die Friedmann-Lemaître-Robertson-Walker-Metrik in mühelose Function Calls. Anstatt deine eigenen Integratoren zu schreiben, um die Rotverschiebung auf physikalische Entfernungen zu mappen, definierst du ein kosmologisches Modell, und die Library kümmert sich um die zugrundeliegende Geometrie. Eine Kosmologie in Astropy ist ein Python Object. Du kannst eins mit der FlatLambdaCDM Class von Grund auf neu bauen. Du übergibst ihm eine Hubble-Konstante, wie siebzig, und eine anfängliche Materiedichte, wie null Komma drei. Das gibt dir ein räumlich flaches Universum, das von dunkler Energie und kalter dunkler Materie angetrieben wird. Du musst diese Parameter jedoch selten selbst eintippen. Astropy enthält standardmäßige Built-in Realizations, die aus großen Surveys abgeleitet wurden. Du importierst einfach Planck13 oder WMAP9 aus dem cosmology Modul, und du hast sofort ein fertig konfiguriertes Modell, das du auswerten kannst. Hier ist der entscheidende Punkt in Sachen State. Die Parameter eines Astropy cosmology Objects sind strikt immutable. Wenn du ein Modell initialisierst und dann entscheidest, dass du die Materiedichte anpassen willst, kannst du dieses Attribute nicht in place updaten. Wenn du das versuchst, wird ein Error geworfen. Stattdessen rufst du die clone Method auf deinem bestehenden Modell auf und übergibst den neuen Parameterwert als Argument. Das gibt eine brandneue cosmology Instance mit deinen aktualisierten Werten zurück. Nehmen wir ein konkretes Szenario mit dem Planck13 Built-in Modell. Angenommen, du beobachtest eine Galaxie mit einer Rotverschiebung von zwei. Du willst ihre Lookback Time wissen, also wie viele Jahre das Licht gebraucht hat, um dein Teleskop zu erreichen. Du nimmst dein Planck13 Object, rufst seine lookback time Method auf und übergibst ihr die Zahl zwei. Die Method gibt eine Time Quantity in Gigajahren zurück. Du verwendest genau dasselbe Pattern, um die Luminosity Distance zu berechnen. Du rufst die luminosity distance Method mit deiner Rotverschiebung auf, und Astropy gibt die Distanz in Megaparsec zurück, wobei die Expansion des Universums eingerechnet wird. Das deckt Inputs und Outputs ab, aber was ist mit dem umgekehrten Weg? Manchmal hast du eine physikalische Messung und musst die entsprechende Rotverschiebung finden. Sagen wir, du willst die exakte Rotverschiebung wissen, bei der das Universum genau zwei Milliarden Jahre alt war. Du kannst nicht einfach ein Alter an die Standard Methods übergeben. Stattdessen importierst du eine Function namens z at value. Du übergibst ihr die Method, die du invertieren willst – also die age Method deines Planck13 Modells – und du übergibst ihr den Target Value von zwei Gigajahren. Astropy führt im Hintergrund eine numerische Root-Finding Routine aus und gibt die präzise Rotverschiebung zurück. Das Konvertieren zwischen Rotverschiebung und physikalischer Zeit oder Entfernung ist das Rückgrat der extragalaktischen Astronomie, und dieses Modul gibt dir eine getestete Source of Truth, sodass du dich auf Daten konzentrieren kannst, anstatt Integrale zu debuggen. Da das die letzte Folge unserer Astropy-Serie ist, ermutige ich dich, die offizielle Documentation durchzulesen, diese Tools hands-on auszuprobieren oder DEV STORIES DOT EU zu besuchen, um Themen für unsere nächste Serie vorzuschlagen. Danke, dass du ein paar Minuten mit mir verbracht hast. Bis zum nächsten Mal, mach's gut.