What’s the best/most performant way?
with x being the array and n being the number of times i want it repeated:
np.repeat(x[None,...], n, axis=0)
or
ones = [1] * len(x.shape)
np.tile(x, tuple(n, *ones))
note that for a known array size, the latter becomes simple:
np.tile(x, (n, 1, 1))  # x is 2D
                Part of the code for np.tile is:
for i, nrep in enumerate(tup):
    if nrep!=1:
        c = c.reshape(-1, n).repeat(nrep, 0)
In other words, it does repeat on each of the axis with more than 1 repeat.  It is, effect, a generalization of repeat to multiple axes.
So I'd expect timings to be similar, though plain repeat will have less Python overhead.  repeat is compiled.  (a few simple tests confirm this - repeat is 2x faster for small arrays, slightly faster for large ones).
p.s. The x[None,...] step is virtually costless.  And due to broadcasting it might be all you need.
p.s.s.  There is an even faster way of doing this repeat, using np.lib.index_tricks.as_strided.  For a (20,50) shaped x, 
as_strided(x,shape=(n,20,50),strides=(0,200,4))
np.broadcast_arrays also uses as_strided.  So this produces the same thing:
np.broadcast_arrays(np.ones((n,1,1)),x)[1] 
But to be honest, this is just an elaboration on broadcasting, not a true repeat.  The data hasn't been replicated.  The same values are just used n times.
Broadcasting can be used to populate the full array, but the timings are the same as for repeat.  That may be what repeat is doing under the hood.
z = np.empty((300,20,50),dtype=int)
z[:] = x[None,...]
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With