From 2e4fafe455d1ee0196f16ee7b19f07dfa26cd98a Mon Sep 17 00:00:00 2001 From: Soumya Snigdha Kundu Date: Thu, 2 Jul 2026 20:38:13 +0100 Subject: [PATCH 1/3] Skip redundant full-image mask on StdShiftIntensity nonzero=False path On the default nonzero=False path the boolean mask is all-True, so img[slices] just gathers and scatters the whole image. Shift the image directly instead, avoiding the mask allocation, .any(), gather and scatter. Output is unchanged. Signed-off-by: Soumya Snigdha Kundu --- monai/transforms/intensity/array.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index 243355b5e3..77f5cf4b14 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -354,16 +354,16 @@ def __init__( self.dtype = dtype def _stdshift(self, img: NdarrayOrTensor) -> NdarrayOrTensor: - ones: Callable std: Callable if isinstance(img, torch.Tensor): - ones = torch.ones std = partial(torch.std, unbiased=False) else: - ones = np.ones std = np.std - slices = (img != 0) if self.nonzero else ones(img.shape, dtype=bool) + if not self.nonzero: + shifted: NdarrayOrTensor = img + self.factor * std(img) + return shifted + slices = img != 0 if slices.any(): offset = self.factor * std(img[slices]) img[slices] = img[slices] + offset From f1cc8815f174d24b3832cdbb71897568ff402ae3 Mon Sep 17 00:00:00 2001 From: Soumya Snigdha Kundu Date: Mon, 6 Jul 2026 04:32:21 +0100 Subject: [PATCH 2/3] Use empty-tuple view for StdShiftIntensity nonzero=False path Address review: keep a single unified code path and preserve in-place semantics by selecting the whole tensor with an empty-tuple index (a view) instead of allocating a full boolean mask. Signed-off-by: Soumya Snigdha Kundu --- monai/transforms/intensity/array.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index 77f5cf4b14..0bd27bc45d 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -360,11 +360,8 @@ def _stdshift(self, img: NdarrayOrTensor) -> NdarrayOrTensor: else: std = np.std - if not self.nonzero: - shifted: NdarrayOrTensor = img + self.factor * std(img) - return shifted - slices = img != 0 - if slices.any(): + slices = (img != 0) if self.nonzero else () + if not self.nonzero or slices.any(): offset = self.factor * std(img[slices]) img[slices] = img[slices] + offset return img From 4031c823c7d603b567d60e629aa2b47c757eda47 Mon Sep 17 00:00:00 2001 From: Soumya Snigdha Kundu Date: Mon, 6 Jul 2026 06:21:51 +0100 Subject: [PATCH 3/3] fix(mypy): narrow slices type on StdShiftIntensity nonzero=False path Signed-off-by: Soumya Snigdha Kundu --- monai/transforms/intensity/array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/transforms/intensity/array.py b/monai/transforms/intensity/array.py index 0bd27bc45d..d941f43ad7 100644 --- a/monai/transforms/intensity/array.py +++ b/monai/transforms/intensity/array.py @@ -361,7 +361,7 @@ def _stdshift(self, img: NdarrayOrTensor) -> NdarrayOrTensor: std = np.std slices = (img != 0) if self.nonzero else () - if not self.nonzero or slices.any(): + if not self.nonzero or (isinstance(slices, (np.ndarray, torch.Tensor)) and slices.any()): offset = self.factor * std(img[slices]) img[slices] = img[slices] + offset return img