2
votes

Comment empiler plusieurs colonnes d'un seul tableau les unes sur les autres en Python?

Par exemple, la forme du tableau est 5,4.

a = 
[[1 4]
 [3 1]
 [4 8]
 [8 1]
 [6 4]
 [5 0]
 [5 1]
 [0 9]
 [5 8]
 [7 4]]

Je veux que le tableau soit remodelé comme suit:

a = np.random.randint(10, size= (5, 4))

a = 
[[1 4 5 0]
 [3 1 5 1]
 [4 8 0 9]
 [8 1 5 8]
 [6 4 7 4]]

Ma taille de tableau d'origine est d'environ 200 Go et de forme 80000 * 480600. J'ai essayé d'utiliser le mode de remappage mais c'est très lent.


1 commentaires

Vous devez ajouter le code que vous avez essayé, afin que nous sachions ce qui prend trop de temps. Il y a un article en double ailleurs. Veuillez vérifier ce lien et voir si cela vous aide. stackoverflow.com/questions/14476415/reshape-an-array -en-num‌ py


3 Réponses :



0
votes

hsplit et reshape fonctionne également

np.reshape(np.hsplit(a, 2), (-1,2))

Out[99]:
array([[1, 4],
       [3, 1],
       [4, 8],
       [8, 1],
       [6, 4],
       [5, 0],
       [5, 1],
       [0, 9],
       [5, 8],
       [7, 4]])


0 commentaires

0
votes

Cela peut être fait avec un remodelage et une transposition (et un remodelage final)

In [200]: np.concatenate(np.hsplit(arr,2), axis=0)                                                           
Out[200]: 
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13],
       [16, 17],
       [ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15],
       [18, 19]])

Identifier la bonne transposition (ou swapaxes ) peut nécessiter un peu d'essai et erreur.

In [199]: arr.reshape(5,2,2).transpose(1,0,2).reshape(-1,2)                                                  
Out[199]: 
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13],
       [16, 17],
       [ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15],
       [18, 19]])

L'équivalent avec split et concatenate:

In [195]: arr = np.arange(20).reshape(5,4)                                                                   
In [196]: arr                                                                                                
Out[196]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
In [197]: arr.reshape(5,2,2)                                                                                 
Out[197]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19]]])
In [198]: arr.reshape(5,2,2).transpose(1,0,2)                                                                
Out[198]: 
array([[[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13],
        [16, 17]],

       [[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15],
        [18, 19]]])

La route de transposition devrait être plus rapide. p >


1 commentaires

Merci beaucoup pour le commentaire!