Skip to content

Commit c40a18b

Browse files
committed
ENH: Allow save-time passing of on-disk dtype to to_* methods
1 parent d41b353 commit c40a18b

File tree

4 files changed

+24
-14
lines changed

4 files changed

+24
-14
lines changed

nibabel/analyze.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -992,23 +992,29 @@ def _get_fileholders(file_map):
992992
"""
993993
return file_map['header'], file_map['image']
994994

995-
def to_file_map(self, file_map=None):
995+
def to_file_map(self, file_map=None, dtype=None):
996996
""" Write image to `file_map` or contained ``self.file_map``
997997
998998
Parameters
999999
----------
10001000
file_map : None or mapping, optional
10011001
files mapping. If None (default) use object's ``file_map``
10021002
attribute instead
1003+
dtype : dtype-like, optional
1004+
The on-disk data type to coerce the data array.
10031005
"""
10041006
if file_map is None:
10051007
file_map = self.file_map
10061008
data = np.asanyarray(self.dataobj)
10071009
self.update_header()
10081010
hdr = self._header
1009-
out_dtype = self.get_data_dtype()
10101011
# Store consumable values for later restore
10111012
offset = hdr.get_data_offset()
1013+
data_dtype = hdr.get_data_dtype()
1014+
# Override dtype conditionally
1015+
if dtype is not None:
1016+
hdr.set_data_dtype(dtype)
1017+
out_dtype = hdr.get_data_dtype()
10121018
# Scalars of slope, offset to get immutable values
10131019
slope = hdr['scl_slope'].item() if hdr.has_data_slope else np.nan
10141020
inter = hdr['scl_inter'].item() if hdr.has_data_intercept else np.nan
@@ -1048,6 +1054,7 @@ def to_file_map(self, file_map=None):
10481054
self.file_map = file_map
10491055
# Restore any changed consumable values
10501056
hdr.set_data_offset(offset)
1057+
hdr.set_data_dtype(data_dtype)
10511058
if hdr.has_data_slope:
10521059
hdr['scl_slope'] = slope
10531060
if hdr.has_data_intercept:

nibabel/cifti2/cifti2.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,7 @@ def from_image(klass, img):
14601460
return img
14611461
raise NotImplementedError
14621462

1463-
def to_file_map(self, file_map=None):
1463+
def to_file_map(self, file_map=None, dtype=None):
14641464
""" Write image to `file_map` or contained ``self.file_map``
14651465
14661466
Parameters
@@ -1493,7 +1493,7 @@ def to_file_map(self, file_map=None):
14931493
# If qform not set, reset pixdim values so Nifti2 does not complain
14941494
if header['qform_code'] == 0:
14951495
header['pixdim'][:4] = 1
1496-
img = Nifti2Image(data, None, header)
1496+
img = Nifti2Image(data, None, header, dtype=dtype)
14971497
img.to_file_map(file_map or self.file_map)
14981498

14991499
def update_headers(self):

nibabel/filebasedimages.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -299,24 +299,26 @@ def filespec_to_file_map(klass, filespec):
299299
file_map[key] = FileHolder(filename=fname)
300300
return file_map
301301

302-
def to_filename(self, filename):
303-
""" Write image to files implied by filename string
302+
def to_filename(self, filename, **kwargs):
303+
r""" Write image to files implied by filename string
304304
305305
Parameters
306306
----------
307307
filename : str or os.PathLike
308308
filename to which to save image. We will parse `filename`
309309
with ``filespec_to_file_map`` to work out names for image,
310310
header etc.
311+
\*\*kwargs : keyword arguments
312+
Keyword arguments to format-specific save
311313
312314
Returns
313315
-------
314316
None
315317
"""
316318
self.file_map = self.filespec_to_file_map(filename)
317-
self.to_file_map()
319+
self.to_file_map(**kwargs)
318320

319-
def to_file_map(self, file_map=None):
321+
def to_file_map(self, file_map=None, **kwargs):
320322
raise NotImplementedError
321323

322324
@classmethod
@@ -552,13 +554,14 @@ def from_bytes(klass, bytestring):
552554
file_map = klass.make_file_map({'image': bio, 'header': bio})
553555
return klass.from_file_map(file_map)
554556

555-
def to_bytes(self):
556-
""" Return a ``bytes`` object with the contents of the file that would
557+
def to_bytes(self, **kwargs):
558+
r""" Return a ``bytes`` object with the contents of the file that would
557559
be written if the image were saved.
558560
559561
Parameters
560562
----------
561-
None
563+
\*\*kwargs : keyword arguments
564+
Keyword arguments that may be passed to ``img.to_file_map()``
562565
563566
Returns
564567
-------
@@ -569,5 +572,5 @@ def to_bytes(self):
569572
raise NotImplementedError("to_bytes() is undefined for multi-file images")
570573
bio = io.BytesIO()
571574
file_map = self.make_file_map({'image': bio, 'header': bio})
572-
self.to_file_map(file_map)
575+
self.to_file_map(file_map, **kwargs)
573576
return bio.getvalue()

nibabel/spm99analyze.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ def from_file_map(klass, file_map, *, mmap=True, keep_file_open=None):
308308
ret._affine = np.dot(ret._affine, to_111)
309309
return ret
310310

311-
def to_file_map(self, file_map=None):
311+
def to_file_map(self, file_map=None, dtype=None):
312312
""" Write image to `file_map` or contained ``self.file_map``
313313
314314
Extends Analyze ``to_file_map`` method by writing ``mat`` file
@@ -321,7 +321,7 @@ def to_file_map(self, file_map=None):
321321
"""
322322
if file_map is None:
323323
file_map = self.file_map
324-
super(Spm99AnalyzeImage, self).to_file_map(file_map)
324+
super(Spm99AnalyzeImage, self).to_file_map(file_map, dtype=dtype)
325325
mat = self._affine
326326
if mat is None:
327327
return

0 commit comments

Comments
 (0)