From 5c16d09d5532a7931dfe6e33fac69efa54d7573f Mon Sep 17 00:00:00 2001 From: Chris Meyer <34664+cmeyer@users.noreply.github.com> Date: Tue, 23 Jun 2026 07:44:25 -0700 Subject: [PATCH 1/2] Minor error message fixes. --- nion/data/Core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nion/data/Core.py b/nion/data/Core.py index c557918..cef76aa 100755 --- a/nion/data/Core.py +++ b/nion/data/Core.py @@ -211,7 +211,7 @@ def calculate_data() -> _ImageDataType: scaling = numpy.sqrt(data_shape[1] * data_shape[0]) return scipy.fft.ifft2(scipy.fft.ifftshift(data_copy) * scaling) # type: ignore else: - raise NotImplementedError() + raise NotImplementedError(f"Inverse FFT: unsupported data shape {data_shape}") src_dimensional_calibrations = data_and_metadata.dimensional_calibrations @@ -723,7 +723,7 @@ def function_fourier_mask(data_and_metadata_in: _DataAndMetadataIndeterminateSiz shape = DataAndMetadata.determine_shape(data_and_metadata_c, mask_data_and_metadata_c) if shape is None: - raise ValueError("Fourier mask: data and ask shapes do not match or are indeterminate") + raise ValueError("Fourier mask: data and mask shapes do not match or are indeterminate") data_and_metadata = DataAndMetadata.promote_constant(data_and_metadata_c, shape) mask_data_and_metadata = DataAndMetadata.promote_constant(mask_data_and_metadata_c, shape) From 9323ee6cf9af97ad100e4735e5ef150cedcb7eb7 Mon Sep 17 00:00:00 2001 From: Chris Meyer <34664+cmeyer@users.noreply.github.com> Date: Tue, 23 Jun 2026 07:58:51 -0700 Subject: [PATCH 2/2] Fix typing issues for numpy 2.5. --- nion/data/Core.py | 15 +++++++++++---- nion/data/test/Core_test.py | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/nion/data/Core.py b/nion/data/Core.py index cef76aa..3b55bef 100755 --- a/nion/data/Core.py +++ b/nion/data/Core.py @@ -1168,7 +1168,7 @@ def calculate_data() -> _ImageDataType: slice_start = max(slice_start, 0) slice_end = slice_start + slice_width slice_end = min(shape[signal_index], slice_end) - return typing.cast(_ImageDataType, numpy.sum(data[..., slice_start:slice_end], signal_index)) + return numpy.sum(data[..., slice_start:slice_end], signal_index) dimensional_calibrations = data_and_metadata.dimensional_calibrations @@ -1373,7 +1373,11 @@ def calculate_data() -> _ImageDataType: rgba_image[:, 3] = numpy.average(data[..., 3], axis) return rgba_image else: - return typing.cast(_ImageDataType, numpy.sum(data, typing.cast(typing.Any, axis), keepdims=keepdims)) + # this bit of gymnastics is necessary to work around a seeming type checking bug in numpy 2.5 + if keepdims: + return numpy.sum(data, axis, keepdims=True) + else: + return numpy.sum(data, axis, keepdims=False) if not Image.is_data_valid(data_and_metadata.data): raise ValueError("Sum: invalid data") @@ -1421,7 +1425,10 @@ def calculate_data() -> _ImageDataType: rgba_image[:, 3] = numpy.average(data[..., 3], axis) return rgba_image else: - return typing.cast(_ImageDataType, numpy.mean(data, axis, keepdims=keepdims)) + if keepdims: + return numpy.mean(data, axis, keepdims=True) + else: + return typing.cast(_ImageDataType, numpy.mean(data, axis, keepdims=False)) if not Image.is_data_valid(data_and_metadata.data): raise ValueError("Mean: invalid data") @@ -1985,7 +1992,7 @@ def calculate_data(data: _ImageDataType) -> _ImageDataType: yy, xx = get_coordinates(start_data, end_data, actual_integration_width) samples = scipy.ndimage.map_coordinates(data, (yy, xx), order=spline_order) if len(samples.shape) > 1: - return typing.cast(_ImageDataType, numpy.sum(samples, 0, dtype=data.dtype)) + return numpy.sum(samples, 0, dtype=data.dtype) else: return typing.cast(_ImageDataType, samples) else: diff --git a/nion/data/test/Core_test.py b/nion/data/test/Core_test.py index 503dcfb..5338300 100755 --- a/nion/data/test/Core_test.py +++ b/nion/data/test/Core_test.py @@ -413,12 +413,12 @@ def test_slice_sum_works_on_2d_data(self) -> None: self.assertEqual(result.dimensional_calibrations[0], data_and_metadata.dimensional_calibrations[0]) def test_fft_works_on_rgba_data(self) -> None: - random_data = numpy.random.randint(0, 256, (32, 32, 4), numpy.uint8) + random_data = numpy.random.randint(0, 256, (32, 32, 4), dtype=numpy.uint8) data_and_metadata = DataAndMetadata.new_data_and_metadata(data=random_data) Core.function_fft(data_and_metadata) def test_display_data_2d_not_a_view(self) -> None: - random_data = numpy.random.randint(0, 256, (2, 2), numpy.uint8) + random_data = numpy.random.randint(0, 256, (2, 2), dtype=numpy.uint8) data_and_metadata = DataAndMetadata.new_data_and_metadata(data=random_data) display_xdata = Core.function_display_data(data_and_metadata) assert display_xdata @@ -427,7 +427,7 @@ def test_display_data_2d_not_a_view(self) -> None: self.assertTrue(numpy.array_equal(display_xdata._data_ex, display_xdata_copy._data_ex)) def test_display_rgba_with_1d_rgba(self) -> None: - random_data = numpy.random.randint(0, 256, (32, 4), numpy.uint8) + random_data = numpy.random.randint(0, 256, (32, 4), dtype=numpy.uint8) data_and_metadata = DataAndMetadata.new_data_and_metadata(data=random_data) Core.function_display_rgba(data_and_metadata)