From 7c93989cc8288f975879e4ab84fa76c0f312281a Mon Sep 17 00:00:00 2001 From: f-dy Date: Mon, 27 Jul 2026 15:23:17 +0200 Subject: [PATCH] fix: coerce numpy scalars in colmap write_next_bytes for NumPy 2.x NumPy 2.x no longer implicitly converts a size-1 ndarray or a NumPy scalar to a Python scalar inside struct.pack, so writing COLMAP binary models (e.g. Point3D.error passed as np.array([0])) raised 'struct.error: required argument is not a float'. Coerce ndarray/generic to a Python scalar via .item() before packing. Fixes the failing tests/process_data/test_process_images.py cases. --- nerfstudio/data/utils/colmap_parsing_utils.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nerfstudio/data/utils/colmap_parsing_utils.py b/nerfstudio/data/utils/colmap_parsing_utils.py index 0eeaf6911b..739a0996d7 100644 --- a/nerfstudio/data/utils/colmap_parsing_utils.py +++ b/nerfstudio/data/utils/colmap_parsing_utils.py @@ -96,6 +96,11 @@ def write_next_bytes(fid, data, format_char_sequence, endian_character="<"): if isinstance(data, (list, tuple)): bytes = struct.pack(endian_character + format_char_sequence, *data) else: + # NumPy 2.x no longer implicitly converts a size-1 ndarray (or a NumPy + # scalar) to a Python scalar inside struct.pack, which raises + # "required argument is not a float/integer". Coerce explicitly. + if isinstance(data, (np.ndarray, np.generic)): + data = data.item() bytes = struct.pack(endian_character + format_char_sequence, data) fid.write(bytes)