diff --git a/monai/data/image_reader.py b/monai/data/image_reader.py index c300476a6b..de02eb0593 100644 --- a/monai/data/image_reader.py +++ b/monai/data/image_reader.py @@ -1217,7 +1217,7 @@ def _get_array_data(self, img, filename): data_offset = img.dataobj.offset data_dtype = img.dataobj.dtype return image[data_offset:].view(data_dtype).reshape(data_shape, order="F") - return np.asanyarray(img.dataobj, order="C") + return np.asanyarray(img.dataobj) class NumpyReader(ImageReader): diff --git a/tests/data/test_init_reader.py b/tests/data/test_init_reader.py index 4170412207..169fd20a5f 100644 --- a/tests/data/test_init_reader.py +++ b/tests/data/test_init_reader.py @@ -11,8 +11,12 @@ from __future__ import annotations +import os +import tempfile import unittest +import numpy as np + from monai.data import ITKReader, NibabelReader, NrrdReader, NumpyReader, PILReader, PydicomReader from monai.transforms import LoadImage, LoadImaged from tests.test_utils import SkipIfNoModule @@ -76,6 +80,26 @@ def test_readers_to_gpu(self): inst = NibabelReader(to_gpu=to_gpu) self.assertIsInstance(inst, NibabelReader) + @SkipIfNoModule("nibabel") + def test_nibabel_reader_avoids_eager_c_order_copy(self): + import nibabel as nib + + test_image = np.arange(2 * 3 * 4, dtype=np.int16).reshape(2, 3, 4) + with tempfile.TemporaryDirectory() as tempdir: + for suffix in (".nii", ".nii.gz"): + with self.subTest(suffix=suffix): + filename = os.path.join(tempdir, f"test_image{suffix}") + nib.save(nib.Nifti1Image(test_image, np.eye(4)), filename) + + reader = NibabelReader(mmap=False) + img = reader.read(filename) + data, _ = reader.get_data(img) + + np.testing.assert_array_equal(data, test_image) + # The reader must not force an eager C-order copy; the native + # (F-order) layout from nibabel should be preserved here. + self.assertFalse(data.flags.c_contiguous) + if __name__ == "__main__": unittest.main()