Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion monai/data/image_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
24 changes: 24 additions & 0 deletions tests/data/test_init_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Loading