Rearrange

Tensor re-arrange with templates, seems to be useful

def rearrange_1() -> t.Tensor:
    """Return the following tensor using only torch.arange and einops.rearrange:
 
    [[3, 4],
     [5, 6],
     [7, 8]]
    """
    tensor = t.arange(3, 9)
    return rearrange(tensor, "(h w) -> h w", h=3, w=2)
 
def rearrange_2() -> t.Tensor:
    """Return the following tensor using only torch.arange and einops.rearrange:
 
    [[1, 2, 3],
     [4, 5, 6]]
    """
    tensor = t.arange(1,7)
    return rearrange(tensor, "(h w) -> h w", h=2, w=3)
 
 
assert_all_equal(rearrange_2(), t.tensor([[1, 2, 3], [4, 5, 6]]))
 
 
def rearrange_3() -> t.Tensor:
    """Return the following tensor using only torch.arange and einops.rearrange:
 
    [[[1], [2], [3], [4], [5], [6]]]
    """
    tensor = t.arange(1,7)
    return rearrange(tensor, "a -> 1 a 1")

Reduce