Source code for cellmap_segmentation_challenge.utils.eval_utils.array_utils

"""Array manipulation utilities for evaluation."""

import numpy as np


[docs] def resize_array(arr, target_shape, pad_value=0): """ Resize an array to a target shape by padding or cropping as needed. Parameters: arr (np.ndarray): Input array to resize. target_shape (tuple): Desired shape for the output array. pad_value (int, float, etc.): Value to use for padding if the array is smaller than the target shape. Returns: np.ndarray: Resized array with the specified target shape. """ arr_shape = arr.shape resized_arr = arr # Pad if the array is smaller than the target shape pad_width = [] for i in range(len(target_shape)): if arr_shape[i] < target_shape[i]: # Padding needed: calculate amount for both sides pad_before = (target_shape[i] - arr_shape[i]) // 2 pad_after = target_shape[i] - arr_shape[i] - pad_before pad_width.append((pad_before, pad_after)) else: # No padding needed for this dimension pad_width.append((0, 0)) if any(pad > 0 for pads in pad_width for pad in pads): resized_arr = np.pad( resized_arr, pad_width, mode="constant", constant_values=pad_value ) # Crop if the array is larger than the target shape slices = [] for i in range(len(target_shape)): if arr_shape[i] > target_shape[i]: # Calculate cropping slices to center the crop start = (arr_shape[i] - target_shape[i]) // 2 end = start + target_shape[i] slices.append(slice(start, end)) else: # No cropping needed for this dimension slices.append(slice(None)) return resized_arr[tuple(slices)]