def putmask_inplace(values: ArrayLike, mask: npt.NDArray[np.bool_], value: Any) -> None: """ ExtensionArray-compatible implementation of np.putmask. The main difference is we do not handle repeating or truncating like numpy. Parameters ---------- values: np.ndarray or ExtensionArray mask : np.ndarray[bool] We assume extract_bool_array has already been called. value : Any """ if lib.is_scalar(value) and isinstance(values, np.ndarray): value = convert_scalar_for_putitemlike(value, values.dtype) if ( not isinstance(values, np.ndarray) or (values.dtype == object and not lib.is_scalar(value)) # GH#43424: np.putmask raises TypeError if we cannot cast between types with # rule = "safe", a stricter guarantee we may not have here or ( isinstance(value, np.ndarray) and not np.can_cast(value.dtype, values.dtype) ) ): # GH#19266 using np.putmask gives unexpected results with listlike value # along with object dtype if is_list_like(value) and len(value) == len(values): values[mask] = value[mask] else: values[mask] = value else: # GH#37833 np.putmask is more performant than __setitem__ np.putmask(values, mask, value)
def putmask_inplace(values: ArrayLike, mask: np.ndarray, value: Any) -> None: """ ExtensionArray-compatible implementation of np.putmask. The main difference is we do not handle repeating or truncating like numpy. Parameters ---------- mask : np.ndarray[bool] We assume _extract_bool_array has already been called. value : Any """ if lib.is_scalar(value) and isinstance(values, np.ndarray): value = convert_scalar_for_putitemlike(value, values.dtype) if not isinstance(values, np.ndarray) or (values.dtype == object and not lib.is_scalar(value)): # GH#19266 using np.putmask gives unexpected results with listlike value if is_list_like(value) and len(value) == len(values): values[mask] = value[mask] else: values[mask] = value else: # GH#37833 np.putmask is more performant than __setitem__ np.putmask(values, mask, value)