Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Numpy tile for complex transformation

Suppose there’s an array

arr = np.array([[1,2,3], [4,5,6]])

My goal is to repeat N = 2 times the elements that are on axis = 0, so the desired output is

array([[[1., 4.],
    [1., 4.]],

   [[2., 5.],
    [2., 5.]],

   [[3., 6.],
    [3., 6.]]])

I’ve tried np.ones((2,2))*arr.T[:,:,None], but the output differs

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

array([[[1., 1.],
    [4., 4.]],

   [[2., 2.],
    [5., 5.]],

   [[3., 3.],
    [6., 6.]]])

Is there an easy way to fix that? In guess it’s the matter of transposition, but I’m not sure how to achieve that.

EDIT: I’ve found the answer. It is:

np.transpose(np.ones((2,2))*arr.T[:,:,None], axes = tuple([0, 2, 1]))

>Solution :

One method

(s0,s1)=arr.strides
np.lib.stride_tricks.as_strided(arr, shape=(3, 2, 2), strides=(s1,0,s0))

Note that it is basically free: it does nothing, and return the same arr. Just, a change of strides make iterations goes along arr axis 1 for the new array axis 0; just repeat for axis 1; and along arr axis 0 for the new array axis 2.

A generalization to all sizes of 2D arr, and all repetitions

def myrepeat(arr, n):
   (sh0,sh1)=arr.shape
   (st0,st1)=arr.strides
   return np.lib.stride_tricks.as_strided(arr, shape=(sh1,n,sh0), strides=(st1,0,st0))

# Example
arr=np.arange(20).reshape(4,5)
myrepeat(arr,3)

Returns

array([[[ 0,  5, 10, 15],
        [ 0,  5, 10, 15],
        [ 0,  5, 10, 15]],

       [[ 1,  6, 11, 16],
        [ 1,  6, 11, 16],
        [ 1,  6, 11, 16]],

       [[ 2,  7, 12, 17],
        [ 2,  7, 12, 17],
        [ 2,  7, 12, 17]],

       [[ 3,  8, 13, 18],
        [ 3,  8, 13, 18],
        [ 3,  8, 13, 18]],

       [[ 4,  9, 14, 19],
        [ 4,  9, 14, 19],
        [ 4,  9, 14, 19]]])
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading