Einops 80 recently got support for repeat-like patterns. Examples:
# np.repeat behavior (copies are in succession, like aaabbbcccddd as described by topic starter)
einops.repeat(x, 'b c h w -> (b copy) c h w', copy=3)
# np.tile behavior (whole sequence is repeated 3 times like abcdabcdabcd)
einops.repeat(x, 'b c h w -> (copy b) c h w', copy=3)

You can repeat/tile multiple axes independently within one operation.