numpy: extending arrays along a new axis?

13,002

Solution 1

Here is one way:

import scipy
X = scipy.rand(9,4,1)
Y = X.repeat(4096,2)

If X is given to you as only (9,4), then

import scipy
X = scipy.rand(9,4)
Y = X.reshape(9,4,1).repeat(4096,2)

Solution 2

You can also rely on the broadcasting rules to repeat-fill a re-sized array:

import numpy
X = numpy.random.rand(9,4)
Y = numpy.resize(X,(4096,9,4))

If you don't like the axes ordered this way, you can then transpose:

Z = Y.transpose(1,2,0)

Solution 3

Question is super old, but here's another option anyway:

import numpy as np
X = np.random.rand(9,4)
Y = np.dstack([X] * 4096)

Solution 4

A simple numpy solution woudl be using numpy.tile

import numpy as np
a = np.random.rand(9, 4)
b = np.tile(a, (4096, 1, 1))
Share:
13,002

Related videos on Youtube

Duncan Tait
Author by

Duncan Tait

Updated on April 15, 2022

Comments

  • Duncan Tait
    Duncan Tait about 2 years

    Surely there must be a way to do this... I can't work it out.

    I have a (9,4) array, and I want to repeat it along a 3rd axis 4096 times... So it becomes simply (9,4,4096), with each value from the 9,4 array simply repeated 4096 times down the new axis.

    If my dubious 3D diagram makes sense (the diagonal is a z-axis)

    4|   /off to 4096
    3|  /
    2| /
    1|/_ _ _ _ _ _ _ _ _ 
       1 2 3 4 5 6 7 8 9
    

    Cheers

    EDIT: Just to clarify, the emphasis here is on the (9,4) array being REPEATED for each of the 4096 'rows' of the new axis. Imagine a cross-section - each original (9,4) array is one of those down the 4096 long cuboid.

    • abcd
      abcd over 10 years
      np.tile is another option. See answers to this question.
    • Ajeet Ganga
      Ajeet Ganga almost 9 years
      Also you have drawn diagram for 4 by 9 matrix. :)
  • Duncan Tait
    Duncan Tait about 14 years
    Thanks again Steve, was getting confused because I didn't realise you had to reshape the array before using the repeat method - it kept telling me I was trying to use an axis that wasn't defined. Makes sense though now.
  • blubberdiblub
    blubberdiblub almost 8 years
    Instead of [X for i in range(4096)] you can just do [X] * 4096.