flange-ml-api / utils /serialization.py
bbmb's picture
Initial backend deployment
2c11783
"""
Helpers for converting numpy arrays and other ML outputs to JSON-serializable
Python structures. FastAPI's JSONResponse cannot serialize numpy types directly.
"""
import numpy as np
def ndarray_to_list(arr: np.ndarray) -> list:
"""Recursively convert ndarray to nested Python lists."""
return arr.tolist()
def float32(v) -> float:
"""Safely convert any numeric type to a Python float."""
return float(v)
def safe_dict(d: dict) -> dict:
"""
Walk a dict and convert any numpy scalars / arrays to Python native types.
Safe for nested dicts and lists.
"""
out = {}
for k, v in d.items():
if isinstance(v, np.ndarray):
out[k] = v.tolist()
elif isinstance(v, (np.integer,)):
out[k] = int(v)
elif isinstance(v, (np.floating,)):
out[k] = float(v)
elif isinstance(v, dict):
out[k] = safe_dict(v)
elif isinstance(v, list):
out[k] = safe_list(v)
else:
out[k] = v
return out
def safe_list(lst: list) -> list:
out = []
for v in lst:
if isinstance(v, np.ndarray):
out.append(v.tolist())
elif isinstance(v, (np.integer,)):
out.append(int(v))
elif isinstance(v, (np.floating,)):
out.append(float(v))
elif isinstance(v, dict):
out.append(safe_dict(v))
elif isinstance(v, list):
out.append(safe_list(v))
else:
out.append(v)
return out
def confusion_matrix_to_dict(cm: np.ndarray, class_names: list[str]) -> dict:
"""Convert confusion matrix to a frontend-friendly format."""
return {
"matrix": cm.tolist(),
"class_names": class_names,
"n_classes": len(class_names),
}