0

I want to use this code on very huge array. this code take long time to execute and it is not efficient. is there any way to remove loop and convert this code to optimum way?

>>> import numpy as np
>>> x=np.random.randint(10, size=(4,5,3))
>>> x
array([[[3, 2, 6],
        [4, 6, 6],
        [3, 7, 9],
        [6, 4, 2],
        [9, 0, 1]],

       [[9, 0, 4],
        [1, 8, 9],
        [6, 8, 1],
        [9, 4, 5],
        [1, 5, 2]],

       [[6, 1, 6],
        [1, 8, 8],
        [3, 8, 3],
        [7, 1, 0],
        [7, 7, 0]],

       [[5, 6, 6],
        [8, 3, 1],
        [0, 5, 4],
        [6, 1, 2],
        [5, 6, 1]]])
>>> y=[]
>>> for i in range(x.shape[1]):
    for j in range(x.shape[2]):
        y.append(x[:, i, j].tolist())


>>> y
[[3, 9, 6, 5], [2, 0, 1, 6], [6, 4, 6, 6], [4, 1, 1, 8], [6, 8, 8, 3], [6, 9, 8, 1], [3, 6, 3, 0], [7, 8, 8, 5], [9, 1, 3, 4], [6, 9, 7, 6], [4, 4, 1, 1], [2, 5, 0, 2], [9, 1, 7, 5], [0, 5, 7, 6], [1, 2, 0, 1]]

2 Answers 2

2

You could permute axes with np.transpose and then reshape to 2D -

y = x.transpose(1,2,0).reshape(-1,x.shape[0])

Append with .tolist() for list output.

Sign up to request clarification or add additional context in comments.

2 Comments

what dose reshape(-1.. do ?
2

yes, either use np.reshape(x, shape) or try it with np.ndarray.flatten(x, order='F') (F for Fortran style, column first, according to your example).

read the documentation to find out which parameters fit the best. IMHO, I think ndarray.flatten is the better and more elegant option for you here. However, depending on your exact wanted solution, you might have to reshape the array first.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.