def round_coordinates(cubes, decimals=5): """Round all dimensional coordinates of all cubes.""" for cube in cubes: for coord in cube.coords(dim_coords=True): coord.points = da.round(da.asarray(coord.core_points()), decimals) if coord.bounds is not None: coord.bounds = da.round(da.asarray(coord.core_bounds()), decimals) return cubes
def _fix_units(cube): """Correct the units.""" if cube.var_name in {'e', 'sf'}: # Change evaporation and snowfall units from # 'm of water equivalent' to m cube.units = 'm' if cube.var_name == 'tcc': # Change cloud cover units '(0 - 1)' to valid fraction unit cube.units = 1 if cube.var_name in {'e', 'ro', 'sf', 'tp', 'pev'}: # Change units from meters of water to kg of water # and add missing 'per hour' cube.units = cube.units * 'kg m-3 h-1' cube.data = cube.core_data() * 1000. if cube.var_name in {'ssr', 'ssrd', 'strd', 'tisr'}: # Add missing 'per hour' cube.units = cube.units * 'h-1' if cube.var_name in {'msnlwrf', 'ssrd', 'strd', 'tisr', 'ssr'}: # Radiation fluxes are positive in downward direction cube.attributes['positive'] = 'down' if cube.var_name == 'ptype': cube.units = 1 # Fix rounding errors and mask out 0 (reserved value) cube.data = da.ma.masked_equal(da.round(cube.core_data()), 0) return cube
def test_round(): x = np.random.random(10) d = da.from_array(x, chunks=4) for i in (0, 1, 4, 5): assert_eq(x.round(i), d.round(i)) assert_eq(d.round(2), da.round(d, 2))
def round_coordinates(cubes, decimals=5, coord_names=None): """Round all dimensional coordinates of all cubes in place. Cubes can be a list of Iris cubes, or an Iris `CubeList`. Cubes are modified *in place*. The return value is simply for convenience. Parameters ---------- cubes : iris.cube.CubeList or list of iris.cube.Cube Cubes which are modified in place. decimals : int Number of decimals to round to. coord_names : list of str or None If ``None`` (or a falsey value), all dimensional coordinates will be rounded. Otherwise, only coordinates given by the names in ``coord_names`` are rounded. Returns ------- iris.cube.CubeList or list of iris.cube.Cube The modified input ``cubes``. """ for cube in cubes: if not coord_names: coords = cube.coords(dim_coords=True) else: coords = [cube.coord(c) for c in coord_names if cube.coords(c)] for coord in coords: coord.points = da.round(da.asarray(coord.core_points()), decimals) if coord.bounds is not None: coord.bounds = da.round(da.asarray(coord.core_bounds()), decimals) return cubes
def pad(array, pad_width, mode="constant", **kwargs): padded = da.pad(array, pad_width, mode=mode, **kwargs) # workaround for inconsistency between numpy and dask: https://github.com/dask/dask/issues/5303 if mode == "mean" and issubclass(array.dtype.type, np.integer): warnings.warn( 'dask.array.pad(mode="mean") converts integers to floats. xarray converts ' "these floats back to integers to keep the interface consistent. There is a chance that " "this introduces rounding errors. If you wish to keep the values as floats, first change " "the dtype to a float before calling pad.", UserWarning, ) return da.round(padded).astype(array.dtype) _validate_pad_output_shape(array.shape, pad_width, padded.shape) return padded
def integer_cbf_dumps(w): return da.round(w / accs_per_cbf_dump) * accs_per_cbf_dump