solo989
solo989

Reputation: 33

Numpy Multiply Size

Given a numpy 3-d array

[[[1][4]][[7][10]]]

let's say the first row is 1 4 and the second row is 7 10. If I have a multiplier of 3, the first through third rows would become 1 1 1 4 4 4 and the 4th through 6th rows would become 7 7 7 10 10 10, that is:

[[[1][1][1][4][4][4]][[1][1][1][4][4][4]][[1][1][1][4][4][4]][[7][7][7][10][10][10]][[7][7][7][10][10][10]][[7][7][7][10][10][10]]]

Is there a quick way to do this in numpy? The actual array I'm using has 3 or 4 elements instead of 1 at the bottom level so [1][1][1] could be [1,8,7][1,8,7][1,8,7] instead, but I simplified it here.

Upvotes: 2

Views: 1620

Answers (1)

jez
jez

Reputation: 15349

numpy.repeat sounds like what you want.

Here are some examples:

>>> a = numpy.array( [[[1,2,3],[4,5,6]], [[10,20,30],[40,50,60]]] )
>>> a
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[10, 20, 30],
        [40, 50, 60]]])
>>>
>>> a.repeat( 3, axis=0 )
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 1,  2,  3],
        [ 4,  5,  6]],

       [[10, 20, 30],
        [40, 50, 60]],

       [[10, 20, 30],
        [40, 50, 60]],

       [[10, 20, 30],
        [40, 50, 60]]])
>>>
>>> a.repeat( 3, axis=1 )
array([[[ 1,  2,  3],
        [ 1,  2,  3],
        [ 1,  2,  3],
        [ 4,  5,  6],
        [ 4,  5,  6],
        [ 4,  5,  6]],

       [[10, 20, 30],
        [10, 20, 30],
        [10, 20, 30],
        [40, 50, 60],
        [40, 50, 60],
        [40, 50, 60]]])
>>>
>>> a.repeat( 3, axis=2 )
array([[[ 1,  1,  1,  2,  2,  2,  3,  3,  3],
        [ 4,  4,  4,  5,  5,  5,  6,  6,  6]],

       [[10, 10, 10, 20, 20, 20, 30, 30, 30],
        [40, 40, 40, 50, 50, 50, 60, 60, 60]]])

Depending on the desired shape of your output, you may wish to chain multiple calls to .repeat() with different axis values.

Upvotes: 4

Related Questions