einops
This is a very OP library. Really learned at Dyna Robotics.
Really import to see that these two are not the same:
(Pdb) import einops
(Pdb) x = torch.tensor([[1, 2], [3, 4]])
(Pdb) x
tensor([[1, 2],
        [3, 4]])
(Pdb) einops.repeat(x, 'b d -> (b repeat) d', repeat=3)
tensor([[1, 2],
        [1, 2],
        [1, 2],
        [3, 4],
        [3, 4],
        [3, 4]])
(Pdb) einops.repeat(x, 'b d -> (repeat b) d', repeat=3)
tensor([[1, 2],
        [3, 4],
        [1, 2],
        [3, 4],
        [1, 2],
        [3, 4]])For arbitrary shape, you can do ... :) Very convenient
Other questions
if you do:
torch.cat([x] * repeat, dim=0)That is functionally identical to:
einops.repeat(x, 'b d -> (repeat b) d', repeat=repeat)- Notice that repeat needs to go in front of b
x.repeat(repeat, 1)