Skip to main content

Python bindings for astroz - high-performance astrodynamics library

Project description

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
positions = propagate("satellites.tle", times)
positions = propagate("https://example.com/tles.txt", 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).

Building

Requires Zig and Python 3.10+.

cd bindings/python
pip install -e .

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

astroz-0.9.0-cp312-cp312-manylinux_2_36_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.36+ x86-64

astroz-0.9.0-cp312-cp312-macosx_15_0_universal2.whl (546.5 kB view details)

Uploaded CPython 3.12macOS 15.0+ universal2 (ARM64, x86-64)

astroz-0.9.0-cp311-cp311-manylinux_2_36_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.36+ x86-64

astroz-0.9.0-cp311-cp311-macosx_15_0_universal2.whl (546.7 kB view details)

Uploaded CPython 3.11macOS 15.0+ universal2 (ARM64, x86-64)

astroz-0.9.0-cp310-cp310-manylinux_2_36_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.36+ x86-64

File details

Details for the file astroz-0.9.0-cp312-cp312-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.9.0-cp312-cp312-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 757a0a6b75c003e0d260d4723273a6f1c43a66b73d331fe6e29c2684b8e929b2
MD5 29c03a066703acdb1e30875bcef2c0e5
BLAKE2b-256 2a339b06596061a9e70e71e8242dc5b0f6037a005d1f33564902c3a115a707f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.9.0-cp312-cp312-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.9.0-cp312-cp312-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for astroz-0.9.0-cp312-cp312-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 d0f1ad0b89bb1a209005d9a2ae6fbb9f2d1c45da93ed1942cae787ea8726e937
MD5 57040c2206ebe75045f9061b71c58428
BLAKE2b-256 8ffa06f842527aa775305c203b1b730b2b0b2be86a4db53e1dadf4a59687c7f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.9.0-cp312-cp312-macosx_15_0_universal2.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.9.0-cp311-cp311-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.9.0-cp311-cp311-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 8167f305a4a8322f9639bc897e47780f1d0adde291f6634f8711378be0f7fa63
MD5 58b948240ed22002c3ba4c1b37e0f1e3
BLAKE2b-256 d720992f61bff77b42093e609a27570ef78e5328a019cbde0fca66d89bf59dfc

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.9.0-cp311-cp311-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.9.0-cp311-cp311-macosx_15_0_universal2.whl.

File metadata

File hashes

Hashes for astroz-0.9.0-cp311-cp311-macosx_15_0_universal2.whl
Algorithm Hash digest
SHA256 e533bcf41c8e6b64f0ac0c32081a6c9b63802f7a8a536a7beabbf6d564af21fc
MD5 a52fb99b1d3285e4be6a9f83cf34f949
BLAKE2b-256 d90540d173875425c3203b584cb24b11fb4d2d297e71e220a5501912e789b77f

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.9.0-cp311-cp311-macosx_15_0_universal2.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file astroz-0.9.0-cp310-cp310-manylinux_2_36_x86_64.whl.

File metadata

File hashes

Hashes for astroz-0.9.0-cp310-cp310-manylinux_2_36_x86_64.whl
Algorithm Hash digest
SHA256 b5d82e29a9373d53a614a69dd9bbd74fe387b56d7c75434c7dc5c0ccd417cfe7
MD5 a3e09d24c0534f144d9a8903ca2d370f
BLAKE2b-256 1f532b4b3f2e918613005d601e0560711aa149f4a09711bb6b3c3b40feef5c7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for astroz-0.9.0-cp310-cp310-manylinux_2_36_x86_64.whl:

Publisher: python.yaml on ATTron/astroz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page