Numpy - create matrix with rows of vector
Certainly possible with broadcasting
after adding with m
zeros along the columns, like so -
np.zeros((m,1),dtype=vector.dtype) + vector
Now, NumPy already has an in-built function np.tile
for exactly that same task -
np.tile(vector,(m,1))
Sample run -
In [496]: vectorOut[496]: array([4, 5, 8, 2])In [497]: m = 5In [498]: np.zeros((m,1),dtype=vector.dtype) + vectorOut[498]: array([[4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2]])In [499]: np.tile(vector,(m,1))Out[499]: array([[4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2]])
You can also use np.repeat
after extending its dimension with np.newaxis/None
for the same effect, like so -
In [510]: np.repeat(vector[None],m,axis=0)Out[510]: array([[4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2]])
You can also use integer array indexing
to get the replications, like so -
In [525]: vector[None][np.zeros(m,dtype=int)]Out[525]: array([[4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2]])
And finally with np.broadcast_to
, you can simply create a 2D
view into the input vector
and as such this would be virtually free and with no extra memory requirement. So, we would simply do -
In [22]: np.broadcast_to(vector,(m,len(vector)))Out[22]: array([[4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2], [4, 5, 8, 2]])
Runtime test -
Here's a quick runtime test comparing the various approaches -
In [12]: vector = np.random.rand(10000)In [13]: m = 10000In [14]: %timeit np.broadcast_to(vector,(m,len(vector)))100000 loops, best of 3: 3.4 µs per loop # virtually free!In [15]: %timeit np.zeros((m,1),dtype=vector.dtype) + vector10 loops, best of 3: 95.1 ms per loopIn [16]: %timeit np.tile(vector,(m,1))10 loops, best of 3: 89.7 ms per loopIn [17]: %timeit np.repeat(vector[None],m,axis=0)10 loops, best of 3: 86.2 ms per loopIn [18]: %timeit vector[None][np.zeros(m,dtype=int)]10 loops, best of 3: 89.8 ms per loop