astroz Python Bindings
High-performance SGP4/SDP4 satellite propagation, powered by Zig with SIMD acceleration (AVX512/AVX2). Automatically handles both near-earth and deep-space satellites.
Platforms: macOS, Linux | Requires: Python 3.10+
Quick Start
python-sgp4 Compatible API (Recommended)
Drop-in replacement for python-sgp4:
from astroz.api import Satrec, SatrecArray, jday, WGS72
import numpy as np
# Single satellite (same syntax as python-sgp4)
sat = Satrec.twoline2rv(line1, line2, WGS72)
jd, fr = jday(2024, 5, 6, 12, 0, 0.0)
error, position, velocity = sat.sgp4(jd, fr)
# Batch propagation (270-330M props/sec with SIMD)
sat_array = SatrecArray(satrecs)
e, r, v = sat_array.sgp4(jd, fr) # Scalars or arrays
# Skip velocities for 30% faster propagation
e, r, _ = sat_array.sgp4(jd_array, fr_array, velocities=False)
High-Level API
from astroz import propagate
import numpy as np
# Load and propagate - automatically optimized for 300M+ props/sec
positions = propagate("starlink", np.arange(1440)) # 1 day at 1-min intervals
# positions: (1440, num_satellites, 3) in km, ECEF coordinates
Loading Sources
from astroz import propagate, Constellation
# CelesTrak groups
positions = propagate("starlink", times)
positions = propagate("iss", times)
positions = propagate("gps", times)
positions = propagate("all", times) # ~13k active satellites
# By NORAD ID
positions = propagate(None, times, norad_id=25544) # ISS
positions = propagate(None, times, norad_id=[25544, 48274]) # Multiple
# Local file or URL (TLE or OMM JSON auto-detected)
positions = propagate("satellites.tle", times)
positions = propagate("https://example.com/tles.txt", times)
# OMM JSON (CCSDS 502.0-B-3) — supports 6+ digit NORAD IDs
positions = propagate('{"NORAD_CAT_ID":25544,"EPOCH":"2026-04-15T12:00:00.000000","MEAN_MOTION":15.489,...}', times)
# For repeated propagation, pre-parse to avoid overhead
c = Constellation("starlink")
positions1 = propagate(c, times1)
positions2 = propagate(c, times2)
Groups: all, starlink, oneweb, planet, spire, gps, glonass, galileo, beidou, stations/iss, weather, geo
Propagation
from astroz import propagate, Constellation
from datetime import datetime, timezone
import numpy as np
times = np.arange(1440) # 1 day at 1-min intervals
# Simple (defaults: now UTC, ECEF output)
positions = propagate("starlink", times)
# With options
positions = propagate(
"starlink",
np.arange(14 * 1440), # 2 weeks
start_time=datetime(2024, 6, 1, tzinfo=timezone.utc),
output="geodetic", # "ecef" (default), "teme", or "geodetic"
)
# With velocities
positions, velocities = propagate("starlink", times, velocities=True)
Conjunction Screening
from astroz import screen
import numpy as np
times = np.arange(1440)
# Single target (fastest - uses fused propagate+screen, no full position array)
min_dists, min_t_indices = screen("starlink", times, threshold=50.0, target=0)
# Returns per-satellite minimum distance to target and time index
# All-vs-all screening
pairs, t_indices = screen("starlink", times, threshold=10.0)
# Returns all conjunction events within threshold
Migrating from python-sgp4
Step 1: Change the Import (2x faster)
# Before
from sgp4.api import Satrec, SatrecArray, jday
# After
from astroz.api import Satrec, SatrecArray, jday
That's it. Your existing code works unchanged and runs 2x faster.
Step 2: Use Batch Methods (5-12x faster)
If you have loops, switch to batch methods:
# Before: loop (1.3M props/sec)
results = []
for jd, fr in zip(jd_list, fr_list):
e, r, v = sat.sgp4(jd, fr)
results.append(r)
# After: batch (15M props/sec) - 12x faster
jd_array = np.array(jd_list)
fr_array = np.array(fr_list)
e, r, v = sat.sgp4_array(jd_array, fr_array)
Step 3: Use SatrecArray for Multiple Satellites (100x faster)
# Before: loop over satellites (1.3M props/sec)
for sat in satellites:
e, r, v = sat.sgp4_array(jd, fr)
# After: batch all satellites (290M props/sec) - 100x faster
sat_array = SatrecArray(satellites)
e, r, v = sat_array.sgp4(jd, fr)
Step 4: Skip Velocities If Not Needed (30% faster)
# If you only need positions
e, r, _ = sat_array.sgp4(jd, fr, velocities=False)
Performance Summary
| Pattern | python-sgp4 | astroz | Speedup |
|---|---|---|---|
sat.sgp4() loop |
1.3M/s | 2.5M/s | 2x |
sat.sgp4_array() |
2.7M/s | 15M/s | 5x |
SatrecArray.sgp4() |
3M/s | 290M/s | 100x |
Compatibility Notes
astroz supports the core python-sgp4 API for satellite propagation. Some rarely-used attributes are not implemented:
- TLE metadata:
classification,intldesg,elnum,revnum,ephtype - Intermediate elements:
Om,am,em,im,mm,nm,om(osculating elements after propagation) - Element rates:
argpdot,mdot,nodedot - Gravity constants:
j2,j3,j4,mu, etc. (available viaastroz.constants)
For typical satellite tracking and visualization, astroz is a full drop-in replacement.
Performance
| Constellation (13,478 sats x 1,440 steps) | Throughput |
|---|---|
| 1 thread | 37.7M props/sec |
| 16 threads | 303M props/sec |
Benchmarked on AMD Ryzen 7 7840U with AVX512.
Set ASTROZ_THREADS to control thread count (defaults to all cores).
Orbital Mechanics
from astroz import (
hohmann_transfer, bi_elliptic_transfer, lambert,
orbital_velocity, orbital_period, escape_velocity,
EARTH_MU,
)
# Hohmann transfer: LEO (400 km) to GEO
result = hohmann_transfer(EARTH_MU, 6778, 42164)
print(f"Total ΔV: {result['total_dv']:.3f} km/s")
print(f"Transfer time: {result['transfer_time_days']:.2f} days")
# Bi-elliptic transfer (more efficient for large radius ratios)
result = bi_elliptic_transfer(EARTH_MU, 6778, 42164, 100000)
print(f"Total ΔV: {result['total_dv']:.3f} km/s")
# Lambert solver: find transfer orbit between two positions
r1 = (7000.0, 0.0, 0.0)
r2 = (0.0, 7000.0, 0.0)
tof = 3600.0 # 1 hour
result = lambert(EARTH_MU, r1, r2, tof)
print(f"Departure velocity: {result['departure_velocity']}")
# Orbital velocity, period, escape velocity
v = orbital_velocity(EARTH_MU, 6778) # Circular orbit at 400 km
T = orbital_period(EARTH_MU, 6778) # Period in seconds
v_esc = escape_velocity(EARTH_MU, 6778) # Escape velocity
Numerical Propagation
Propagate orbits with perturbation models (J2, atmospheric drag) using RK4 or
Dormand-Prince 8(7) adaptive integrators. r_eq is required when using J2 or
drag perturbations. Drag uses an exponential Earth atmosphere model (sea-level
density 1.225 kg/m^3, scale height 7.249 km, cutoff altitude 1500 km).
drag_area is in m^2 and drag_mass in kg.
from astroz import propagate_numerical, EARTH_MU, EARTH_J2, EARTH_R_EQ
# Initial state: LEO circular orbit [x, y, z, vx, vy, vz] (km, km/s)
state = (6778.0, 0.0, 0.0, 0.0, 7.668, 0.0)
# Two-body propagation (1 orbit, 60s steps)
times, states = propagate_numerical(state, 0.0, 5554.0, 60.0, EARTH_MU)
# With J2 perturbation
times, states = propagate_numerical(
state, 0.0, 5554.0, 60.0, EARTH_MU,
j2=EARTH_J2, r_eq=EARTH_R_EQ,
)
# With J2 + atmospheric drag
times, states = propagate_numerical(
state, 0.0, 86400.0, 60.0, EARTH_MU,
j2=EARTH_J2, r_eq=EARTH_R_EQ,
drag_cd=2.2, drag_area=10.0, drag_mass=500.0,
integrator="dp87", # or "rk4"
)
Constants
from astroz import EARTH_MU, EARTH_R_EQ, EARTH_J2, SUN_MU, MOON_MU
print(f"Earth μ: {EARTH_MU} km³/s²")
print(f"Earth radius: {EARTH_R_EQ} km")
print(f"Earth J2: {EARTH_J2}")
print(f"Sun μ: {SUN_MU} km³/s²")
print(f"Moon μ: {MOON_MU} km³/s²")
Building
Requires Zig and Python 3.10+.
cd bindings/python
pip install -e .
Metadata
Release files for astroz 0.13.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| astroz-0.13.0-cp314-cp314-manylinux_2_36_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.36+ x86-64 | Details |
| astroz-0.13.0-cp314-cp314-macosx_26_0_universal2.whl | CPython 3.14 | CPython 3.14 | macOS 26.0+ universal2 (ARM64, x86-64) | Details |
| astroz-0.13.0-cp313-cp313-manylinux_2_36_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.36+ x86-64 | Details |
| astroz-0.13.0-cp313-cp313-macosx_26_0_universal2.whl | CPython 3.13 | CPython 3.13 | macOS 26.0+ universal2 (ARM64, x86-64) | Details |
| astroz-0.13.0-cp312-cp312-manylinux_2_36_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.36+ x86-64 | Details |
| astroz-0.13.0-cp312-cp312-macosx_26_0_universal2.whl | CPython 3.12 | CPython 3.12 | macOS 26.0+ universal2 (ARM64, x86-64) | Details |
| astroz-0.13.0-cp311-cp311-manylinux_2_36_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.36+ x86-64 | Details |
| astroz-0.13.0-cp311-cp311-macosx_26_0_universal2.whl | CPython 3.11 | CPython 3.11 | macOS 26.0+ universal2 (ARM64, x86-64) | Details |
| astroz-0.13.0-cp310-cp310-manylinux_2_36_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.36+ x86-64 | Details |
Total release size: 22.2 MB
Release files / astroz-0.13.0-cp314-cp314-manylinux_2_36_x86_64.whl
| Download URL | astroz-0.13.0-cp314-cp314-manylinux_2_36_x86_64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.14 Linux glibc 2.36+ x86-64 |
|
SHA-256 checksum How to use checksums |
e8f72bc2e20bac13d518daf4c17610078446cfd4597d13c4fc098387f018d54c
|
|
BLAKE2b-256 checksum How to use checksums |
84559ec9e4fb09097e67b9547a7b27aef6652829dec45cc352d53ccef7b0129b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp314-cp314-macosx_26_0_universal2.whl
| Download URL | astroz-0.13.0-cp314-cp314-macosx_26_0_universal2.whl |
|---|---|
| Size | 809.9 kB |
| Tags | CPython 3.14 macOS 26.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
50034b0c59a60f44787a99914cd9c62e6a4a44c905239b67f78de184eb2bc69f
|
|
BLAKE2b-256 checksum How to use checksums |
9cdb1e0a0df0e73979a3cd63fa51af535dc2b162d2f4960753cc78e64a6dcc76
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp313-cp313-manylinux_2_36_x86_64.whl
| Download URL | astroz-0.13.0-cp313-cp313-manylinux_2_36_x86_64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | CPython 3.13 Linux glibc 2.36+ x86-64 |
|
SHA-256 checksum How to use checksums |
11ceef77c92c96c2a98d8cba70697d508703b0a6da0c9a2d5fceb95c65c52c67
|
|
BLAKE2b-256 checksum How to use checksums |
5cc3053ef73b532bdcd09b2b30343b8be78889c21b61c44b588b985083971972
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp313-cp313-macosx_26_0_universal2.whl
| Download URL | astroz-0.13.0-cp313-cp313-macosx_26_0_universal2.whl |
|---|---|
| Size | 810.4 kB |
| Tags | CPython 3.13 macOS 26.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
bcdaa4787a511f52479c6c85ebaf218ad38d0d0aa745b2ae802df0a56b07d709
|
|
BLAKE2b-256 checksum How to use checksums |
9e7672e9ab9a0b5831b9938adbc91b185e64d196f45b86ed00d7c72f219fe115
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp312-cp312-manylinux_2_36_x86_64.whl
| Download URL | astroz-0.13.0-cp312-cp312-manylinux_2_36_x86_64.whl |
|---|---|
| Size | 3.9 MB |
| Tags | CPython 3.12 Linux glibc 2.36+ x86-64 |
|
SHA-256 checksum How to use checksums |
dbe931a8e2d13b595bf50b3a29dbe5bef8dcecf252541ea705ecbf6a33841daf
|
|
BLAKE2b-256 checksum How to use checksums |
6e3b34d85bc99863dbd64bb849b161a928300b766eaecd51f12c0f406bb55019
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp312-cp312-macosx_26_0_universal2.whl
| Download URL | astroz-0.13.0-cp312-cp312-macosx_26_0_universal2.whl |
|---|---|
| Size | 810.4 kB |
| Tags | CPython 3.12 macOS 26.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
86a347c2a0649d4cc7939d687da552c4bb8cba1a1ca8a03a95bf7369a29a744a
|
|
BLAKE2b-256 checksum How to use checksums |
c3f6638f2209bc105dff3e3b24aee34cfeeebd06d1a50c05e07c02c69c67d3d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp311-cp311-manylinux_2_36_x86_64.whl
| Download URL | astroz-0.13.0-cp311-cp311-manylinux_2_36_x86_64.whl |
|---|---|
| Size | 3.7 MB |
| Tags | CPython 3.11 Linux glibc 2.36+ x86-64 |
|
SHA-256 checksum How to use checksums |
ed9e70c056a31251af9a548ffe94e37f2a970e19df238d99d54d760f4508de08
|
|
BLAKE2b-256 checksum How to use checksums |
4bb5aa3d9b0739a36be432dcbb61fc28472b0e44f5f098085e7a4ceaa95ad8b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp311-cp311-macosx_26_0_universal2.whl
| Download URL | astroz-0.13.0-cp311-cp311-macosx_26_0_universal2.whl |
|---|---|
| Size | 809.1 kB |
| Tags | CPython 3.11 macOS 26.0+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
a86b246aa3c705f14e3682e657bb2f9128ab260bd1d434d383e32612374502ee
|
|
BLAKE2b-256 checksum How to use checksums |
b610f1555fe9bcb7c586dd06509572a8010bf99174ce38d53a9cf3a6b209dadd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / astroz-0.13.0-cp310-cp310-manylinux_2_36_x86_64.whl
| Download URL | astroz-0.13.0-cp310-cp310-manylinux_2_36_x86_64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | CPython 3.10 Linux glibc 2.36+ x86-64 |
|
SHA-256 checksum How to use checksums |
acc123307d6258816477d84cb52ced04c4088cf978dcf250cd1820acd9ea4176
|
|
BLAKE2b-256 checksum How to use checksums |
8704fd676bb7d82d633c1886240c2eb5563538930ec64ff0c0b0fdc2ebbafa5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency log