Files
routesapi/app/core/arrow_utils.py
2026-07-06 15:15:51 +05:30

34 lines
1.1 KiB
Python

"""
Vectorized NumPy utilities for geographic distance calculations.
"""
import numpy as np
import logging
logger = logging.getLogger(__name__)
def calculate_haversine_matrix_vectorized(lats: np.ndarray, lons: np.ndarray) -> np.ndarray:
"""
Calculate an N x N distance matrix using the Haversine formula.
Fully vectorized using NumPy for O(N^2) speed improvement over Python loops.
"""
# Earth's radius in kilometers
R = 6371.0
# Convert degrees to radians
lats_rad = np.radians(lats)
lons_rad = np.radians(lons)
# Create meshgrids for pairwise differences
# lats.reshape(-1, 1) creates a column vector
# lats.reshape(1, -1) creates a row vector
# Subtracting them creates an N x N matrix of differences
dlat = lats_rad.reshape(-1, 1) - lats_rad.reshape(1, -1)
dlon = lons_rad.reshape(-1, 1) - lons_rad.reshape(1, -1)
# Haversine formula
a = np.sin(dlat / 2)**2 + np.cos(lats_rad.reshape(-1, 1)) * np.cos(lats_rad.reshape(1, -1)) * np.sin(dlon / 2)**2
c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a))
return R * c