def map_coords_to_scaled_float(coords, orig_size, new_size):
    """
    maps coordinates relative to the original 3-D image to coordinates corresponding to the 
    re-scaled 3-D image, given the coordinates and the shapes of the original and "new" scaled
    images.  Returns a floating-point coordinate center where the pixel at array coordinates
    (0,0) has its center at (0.5, 0.5).  Take the floor of the return value from this function
    to get back to indices.
    """
    if not all(
        isinstance(arg, (tuple, list, set)) for arg in (coords, orig_size, new_size)
    ):
        raise TypeError(
            "`coords`, `orig_size` and `new_size` must be tuples corresponding to the image shape."
        )
    if not all(len(arg) == len(coords) for arg in (orig_size, new_size)):
        raise TypeError(
            "Number of dimensions in `coords` ({}), `orig_size` ({}), and `new_size` ({}) did not match.".format(
                len(coords), len(orig_size), len(new_size)
            )
        )

    ratio = lambda dim: float(new_size[dim]) / orig_size[dim]
    center = lambda s, dim: s[dim] / 2.0
    offset = lambda dim: (coords[dim] + 0.5) - center(orig_size, dim)
    new_index = lambda dim: (center(new_size, dim) + ratio(dim) * offset(dim))

    return tuple([new_index(dim) for dim in range(len(orig_size))])