Construct a reshaped-array for coarsen
(self, windows, boundary, side)
| 2272 | return self._replace(data=func(reshaped, axis=axes, **kwargs), attrs=_attrs) |
| 2273 | |
| 2274 | def coarsen_reshape(self, windows, boundary, side): |
| 2275 | """ |
| 2276 | Construct a reshaped-array for coarsen |
| 2277 | """ |
| 2278 | if not is_dict_like(boundary): |
| 2279 | boundary = dict.fromkeys(windows.keys(), boundary) |
| 2280 | |
| 2281 | if not is_dict_like(side): |
| 2282 | side = dict.fromkeys(windows.keys(), side) |
| 2283 | |
| 2284 | # remove unrelated dimensions |
| 2285 | boundary = {k: v for k, v in boundary.items() if k in windows} |
| 2286 | side = {k: v for k, v in side.items() if k in windows} |
| 2287 | |
| 2288 | for d, window in windows.items(): |
| 2289 | if window <= 0: |
| 2290 | raise ValueError( |
| 2291 | f"window must be > 0. Given {window} for dimension {d}" |
| 2292 | ) |
| 2293 | |
| 2294 | variable = self |
| 2295 | pad_widths = {} |
| 2296 | for d, window in windows.items(): |
| 2297 | # trim or pad the object |
| 2298 | size = variable.shape[self._get_axis_num(d)] |
| 2299 | n = int(size / window) |
| 2300 | if boundary[d] == "exact": |
| 2301 | if n * window != size: |
| 2302 | raise ValueError( |
| 2303 | f"Could not coarsen a dimension of size {size} with " |
| 2304 | f"window {window} and boundary='exact'. Try a different 'boundary' option." |
| 2305 | ) |
| 2306 | elif boundary[d] == "trim": |
| 2307 | if side[d] == "left": |
| 2308 | variable = variable.isel({d: slice(0, window * n)}) |
| 2309 | else: |
| 2310 | excess = size - window * n |
| 2311 | variable = variable.isel({d: slice(excess, None)}) |
| 2312 | elif boundary[d] == "pad": # pad |
| 2313 | pad = window * n - size |
| 2314 | if pad < 0: |
| 2315 | pad += window |
| 2316 | elif pad == 0: |
| 2317 | continue |
| 2318 | pad_widths[d] = (0, pad) if side[d] == "left" else (pad, 0) |
| 2319 | else: |
| 2320 | raise TypeError( |
| 2321 | f"{boundary[d]} is invalid for boundary. Valid option is 'exact', " |
| 2322 | "'trim' and 'pad'" |
| 2323 | ) |
| 2324 | if pad_widths: |
| 2325 | variable = variable.pad(pad_widths, mode="constant") |
| 2326 | |
| 2327 | shape = [] |
| 2328 | axes = [] |
| 2329 | axis_count = 0 |
| 2330 | for i, d in enumerate(variable.dims): |
| 2331 | if d in windows: |
no test coverage detected