Commit cc702436 authored by Paul McCarthy's avatar Paul McCarthy 🚵
Browse files

deprecated imagewrapper.naninfrange

parent 8721da08
......@@ -41,11 +41,14 @@ import logging
import collections
import itertools as it
import deprecation
import numpy as np
import nibabel as nib
import fsl.utils.notifier as notifier
import fsl.utils.idle as idle
import fsl.utils.notifier as notifier
import fsl.utils.naninfrange as nir
import fsl.utils.idle as idle
log = logging.getLogger(__name__)
......@@ -137,7 +140,6 @@ class ImageWrapper(notifier.Notifier):
.. autosummary::
:nosignatures:
naninfrange
isValidFancySliceObj
canonicalSliceObj
sliceObjToSliceTuple
......@@ -469,7 +471,7 @@ class ImageWrapper(notifier.Notifier):
oldvlo, oldvhi = self.__volRanges[vol, :]
voldata = data[..., vi]
newvlo, newvhi = naninfrange(voldata)
newvlo, newvhi = nir.naninfrange(voldata)
if np.isnan(newvlo) or \
(not np.isnan(oldvlo) and oldvlo < newvlo):
......@@ -487,7 +489,7 @@ class ImageWrapper(notifier.Notifier):
# Calculate the new known data
# range over the entire image
# (i.e. over all volumes).
newmin, newmax = naninfrange(self.__volRanges)
newmin, newmax = nir.naninfrange(self.__volRanges)
oldmin, oldmax = self.__range
self.__range = (newmin, newmax)
......@@ -713,47 +715,14 @@ class ImageWrapper(notifier.Notifier):
self.__updateDataRangeOnWrite(slices, values)
@deprecation.deprecated(deprecated_in='1.7.0',
removed_in='2.0.0',
details='Moved to fsl.utils.naninfrange')
def naninfrange(data):
"""Returns the minimum and maximum values in the given ``numpy`` array,
ignoring ``nan`` and ``inf`` values.
The ``numpy.nanmin``/``numpy.nanmax`` functions do not handle
positive/negative infinity, so if such values are in the data, we need to
use an alternate approach to calculating the minimum/maximum.
"""
"""Deprecated - moved to :mod:`fsl.utils.naninfrange`. """
if not np.issubdtype(data.dtype, np.floating):
return data.min(), data.max()
# But np.nanmin/nanmax are substantially
# faster than the alternate, so we try it
# first.
dmin = np.nanmin(data)
dmax = np.nanmax(data)
# If there are no nans/infs in the data,
# we can just use nanmin/nanmax
if np.isfinite(dmin) and np.isfinite(dmax):
return dmin, dmax
# The entire array contains nans
if np.isnan(dmin):
return dmin, dmin
# Otherwise we need to calculate min/max
# only on finite values. This is the slow
# option.
# Find all finite values
finite = np.isfinite(data)
# Try to calculate min/max on those values.
# An error will be raised if there are no
# finite values in the array
try:
return data[finite].min(), data[finite].max()
except Exception:
return np.nan, np.nan
from fsl.utils.naninfrange import naninfrange
return naninfrange(data)
def isValidFancySliceObj(sliceobj, shape):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment