| 1254 | |
| 1255 | @derived_from(np) |
| 1256 | def pad(array, pad_width, mode="constant", **kwargs): |
| 1257 | array = asarray(array) |
| 1258 | |
| 1259 | pad_width = expand_pad_value(array, pad_width) |
| 1260 | |
| 1261 | if callable(mode): |
| 1262 | return pad_udf(array, pad_width, mode, **kwargs) |
| 1263 | |
| 1264 | # Make sure that no unsupported keywords were passed for the current mode |
| 1265 | allowed_kwargs = { |
| 1266 | "empty": [], |
| 1267 | "edge": [], |
| 1268 | "wrap": [], |
| 1269 | "constant": ["constant_values"], |
| 1270 | "linear_ramp": ["end_values"], |
| 1271 | "maximum": ["stat_length"], |
| 1272 | "mean": ["stat_length"], |
| 1273 | "median": ["stat_length"], |
| 1274 | "minimum": ["stat_length"], |
| 1275 | "reflect": ["reflect_type"], |
| 1276 | "symmetric": ["reflect_type"], |
| 1277 | } |
| 1278 | try: |
| 1279 | unsupported_kwargs = set(kwargs) - set(allowed_kwargs[mode]) |
| 1280 | except KeyError as e: |
| 1281 | raise ValueError(f"mode '{mode}' is not supported") from e |
| 1282 | if unsupported_kwargs: |
| 1283 | raise ValueError( |
| 1284 | f"unsupported keyword arguments for mode '{mode}': {unsupported_kwargs}" |
| 1285 | ) |
| 1286 | |
| 1287 | if mode in {"maximum", "mean", "median", "minimum"}: |
| 1288 | stat_length = kwargs.get("stat_length", tuple((n, n) for n in array.shape)) |
| 1289 | return pad_stats(array, pad_width, mode, stat_length) |
| 1290 | elif mode == "constant": |
| 1291 | kwargs.setdefault("constant_values", 0) |
| 1292 | return pad_edge(array, pad_width, mode, **kwargs) |
| 1293 | elif mode == "linear_ramp": |
| 1294 | kwargs.setdefault("end_values", 0) |
| 1295 | return pad_edge(array, pad_width, mode, **kwargs) |
| 1296 | elif mode in {"edge", "empty"}: |
| 1297 | return pad_edge(array, pad_width, mode) |
| 1298 | elif mode in ["reflect", "symmetric", "wrap"]: |
| 1299 | return pad_reuse(array, pad_width, mode, **kwargs) |
| 1300 | |
| 1301 | raise RuntimeError("unreachable") |