Skip to main content

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

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 via astroz.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)

Table of built distributions (wheels) for astroz 0.13.0
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

0.14.1

9 release files

0.14.0

9 release files

This release

0.13.0 This release

9 release files

0.12.0

9 release files

0.10.1

9 release files

0.10.0

5 release files

0.9.0

5 release files

0.8.1

5 release files

0.8.0

5 release files

0.7.1

6 release files

0.6.1

6 release files

0.6.0

6 release files

0.5.0

6 release files

0.4.4

6 release files

0.4.3

6 release files

0.4.2

6 release files

0.4.1

3 release files

0.4.0

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page