some optimizations for rescaleData (#1518)
1) use float32 instead of float64 for low precision inputs 2) use in-place operations to avoid unnecessary copies
This commit is contained in:
parent
56ee690d58
commit
9d89d10bcf
@ -951,7 +951,12 @@ def rescaleData(data, scale, offset, dtype=None, clip=None):
|
|||||||
else:
|
else:
|
||||||
dtype = np.dtype(dtype)
|
dtype = np.dtype(dtype)
|
||||||
|
|
||||||
d2 = data.astype(np.float) - float(offset)
|
if np.can_cast(data, np.float32):
|
||||||
|
work_dtype = np.float32
|
||||||
|
else:
|
||||||
|
work_dtype = np.float64
|
||||||
|
d2 = data.astype(work_dtype, copy=True)
|
||||||
|
d2 -= offset
|
||||||
d2 *= scale
|
d2 *= scale
|
||||||
|
|
||||||
# Clip before converting dtype to avoid overflow
|
# Clip before converting dtype to avoid overflow
|
||||||
@ -959,13 +964,14 @@ def rescaleData(data, scale, offset, dtype=None, clip=None):
|
|||||||
lim = np.iinfo(dtype)
|
lim = np.iinfo(dtype)
|
||||||
if clip is None:
|
if clip is None:
|
||||||
# don't let rescale cause integer overflow
|
# don't let rescale cause integer overflow
|
||||||
d2 = np.clip(d2, lim.min, lim.max)
|
np.clip(d2, lim.min, lim.max, out=d2)
|
||||||
else:
|
else:
|
||||||
d2 = np.clip(d2, max(clip[0], lim.min), min(clip[1], lim.max))
|
np.clip(d2, max(clip[0], lim.min), min(clip[1], lim.max), out=d2)
|
||||||
else:
|
else:
|
||||||
if clip is not None:
|
if clip is not None:
|
||||||
d2 = np.clip(d2, *clip)
|
np.clip(d2, *clip, out=d2)
|
||||||
data = d2.astype(dtype)
|
# don't copy if no change in dtype
|
||||||
|
data = d2.astype(dtype, copy=False)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user