[PYTHON] numpy memorandum 2 / transpose n'échange pas seulement les lignes et les colonnes

1.Tout d'abord

Je n'ai pas compris comment utiliser "transepose" en détail, je vais donc laisser le résultat de mon enquête sous forme de mémorandum.

2.2 tableau dimensionnel

import numpy as np

img = np.array([[ 0,  1],
                [ 2,  3]])

img = img.transpose(1,0)
print(img)

# [[0 2]
#  [1 3]]

Aucune conversion n'est «transposer (0, 1)», et les numéros d'axe sont ** axe x (0), axe y (1) **. Avec transpose (1, 0), l'axe des x (0) et l'axe des y (1) sont permutés, ce qui donne une matrice dite de translocation.

3.3 tableau dimensionnel

img = np.array([[[ 0, 1, 2],
                 [ 3, 4, 5],
                 [ 6, 7, 8]],
    
                [[ 9,10,11],
                 [12,13,14],
                 [15,16,17]]])

img = img.transpose(0, 2, 1)
print(img)

# [[[ 0  3  6]
#   [ 1  4  7]
#   [ 2  5  8]]

#  [[ 9 12 15]
#   [10 13 16]
#   [11 14 17]]]

Aucune conversion n'est «transposer (0, 1, 2)», et les numéros d'axe sont ** axe de canal (0), axe x (1), axe y (2) ** (l'axe de canal est un nom donné de manière appropriée). est). Notez que les numéros des axes des abscisses et des ordonnées changent en fonction du nombre de dimensions.

transpose (0, 2, 1) permute l'axe des x (1) et l'axe des y (2).

img = np.array([[[ 0, 1, 2],
                 [ 3, 4, 5],
                 [ 6, 7, 8]],
    
                [[ 9,10,11],
                 [12,13,14],
                 [15,16,17]]])

img = img.transpose(1, 0, 2)
print(img)

# [[[ 0  1  2]
#   [ 9 10 11]]

#  [[ 3  4  5]
#   [12 13 14]]

#  [[ 6  7  8]
#   [15 16 17]]]

En amenant transpose (1, 0, 2) et l'axe des x (1) devant l'axe du canal (0), il s'agissait auparavant de ** traitement dans chaque matrice **, mais ** matrice Traitement entre **. Créez une matrice sur la 0ème ligne, 1 matrice sur la 1ère ligne et 1 matrice sur la 2ème ligne des deux matrices.

img = np.array([[[ 0, 1, 2],
                 [ 3, 4, 5],
                 [ 6, 7, 8]],
    
                [[ 9,10,11],
                 [12,13,14],
                 [15,16,17]]])

img = img.transpose(2, 0, 1)
print(img)

# [[[ 0  3  6]
#   [ 9 12 15]]

#  [[ 1  4  7]
#   [10 13 16]]

#  [[ 2  5  8]
#   [11 14 17]]]

Mettre «transpose (2, 0, 1)» et l'axe y (2) devant l'axe du canal (0) entraînera un traitement inter-matrice comme auparavant. Cette fois, créez une matrice dans la 0ème colonne des deux matrices, 1 matrice dans la 1ère colonne et 1 matrice dans la 2ème colonne.

img = np.array([[[ 0, 1, 2],
                 [ 3, 4, 5],
                 [ 6, 7, 8]],
    
                [[ 9,10,11],
                 [12,13,14],
                 [15,16,17]]])

img = img.transpose(1, 2, 0)
print(img)

# [[[ 0  9]
#   [ 1 10]
#   [ 2 11]]

#  [[ 3 12]
#   [ 4 13]
#   [ 5 14]]

#  [[ 6 15]
#   [ 7 16]
#   [ 8 17]]]

Maintenant, que se passe-t-il si nous amenons à la fois «transposer (1, 2, 0)» et l'axe des x (1), l'axe des y (2) devant l'axe du canal (0)? ** Inclinez les valeurs des mêmes coordonnées dans chaque matrice **.

Cette fois, l'axe des x (0) est le début (priorité), donc la 0ème ligne est décalée pour créer une matrice, la première ligne est décalée pour faire une matrice et la deuxième ligne est décalée pour en faire une Tracer une ligne.

img = np.array([[[ 0, 1, 2],
                 [ 3, 4, 5],
                 [ 6, 7, 8]],
    
                [[ 9,10,11],
                 [12,13,14],
                 [15,16,17]]])

img = img.transpose(2, 1, 0)
print(img)

# [[[ 0  9]
#   [ 3 12]
#   [ 6 15]]

#  [[ 1 10]
#   [ 4 13]
#   [ 7 16]]

#  [[ 2 11]
#   [ 5 14]
#   [ 8 17]]]

Cette fois, si vous amenez transpose (2, 1, 0) et l'axe y (2) au début, l'axe y (2) prévaudra et la colonne 0 sera décalée pour former une matrice. Inclinez la première ligne pour créer une file d'attente et inclinez la deuxième ligne pour créer une file d'attente.

Tableau à 4 dimensions

C'est finalement la 4ème dimension. Je n'expliquerai qu'un seul exemple notable.

img = np.array([
               [[[ 0, 1, 2],
                 [ 3, 4, 5],
                 [ 6, 7, 8]],
    
                [[ 9,10,11],
                 [12,13,14],
                 [15,16,17]]],
               
               [[[18,19,20],
                 [21,22,23],
                 [24,25,26]],
    
                [[27,28,29],
                 [30,31,32],
                 [33,34,35]]]
                ])

img = img.transpose(2, 3, 0, 1)
print(img)

# [[[[ 0  9]
#    [18 27]]

#   [[ 1 10]
#    [19 28]]

#   [[ 2 11]
#    [20 29]]]

#  [[[ 3 12]
#    [21 30]]

#   [[ 4 13]
#    [22 31]]

#   [[ 5 14]
#   [23 32]]]

#  [[[ 6 15]
#    [24 33]]

#   [[ 7 16]
#    [25 34]]

#   [[ 8 17]
#    [26 35]]]]

Aucune conversion n'est transposer (0, 1, 2, 3) et les numéros d'axe sont ** axe batch (0), axe canal (1), axe x (2), axe y (3) ** ( L'axe du lot et l'axe du canal sont nommés de manière appropriée).

Si vous faites «transposer (2, 3, 0, 1)» dans un tableau à 4 dimensions, les mêmes coordonnées de chaque matrice seront décalées de la même manière que dans un tableau à 3 dimensions, mais l'unité d'agrégation n'est pas une ligne mais une unité de coordonnées. Ce sera. Ensuite, les coordonnées sont 0 ligne et 0 colonne, 0 ligne et 1 colonne, 0 ligne et 2 colonnes, 1 ligne et 0 colonne, etc.

Dans le cas de transpose (3, 2, 0, 1), l'ordre dans lequel les coordonnées avancent est changé en 0 ligne 0 colonne, 1 ligne 0 colonne, 2 ligne 0 colonne, 0 ligne 1 colonne, ... Est le même.

4. Exemple d'utilisation réelle

Un exemple simple expliquera un exemple dans lequel la transposition est utilisée dans im2col, un algorithme qui effectue des opérations de convolution à grande vitesse. スクリーンショット 2020-02-08 11.32.22.png Comment puis-je convertir les quatre matrices de gauche en matrice de droite?

img = np.array([
               [[[ 0, 1, 2],
                 [ 4, 5, 6],
                 [ 8, 9, 0]],
    
                [[ 1, 2, 3],
                 [ 5, 6, 7],
                 [ 9, 0, 1]]],
               
               [[[ 4, 5, 6],
                 [ 8, 9, 0],
                 [ 2, 3, 4]],
    
                [[ 5, 6, 7],
                 [ 9, 0, 1],
                 [ 3, 4, 5]]]
                ])

print('img.shape = ',img.shape)
img = img.transpose(2, 3, 0, 1)
print(img)

# img.shape =  (2, 2, 3, 3)

# [[[[0 1]
#    [4 5]]

#   [[1 2]
#    [5 6]]

#   [[2 3]
#    [6 7]]]

#  [[[4 5]
#    [8 9]]

#  [[5 6]
#    [9 0]]

#   [[6 7]
#    [0 1]]]

#  [[[8 9]
#    [2 3]]

#   [[9 0]
#    [3 4]]

#   [[0 1]
#   [4 5]]]]

C'est vrai. Si vous utilisez transpose (2, 3, 0, 1) plus tôt, vous pouvez incliner chaque coordonnée et la regrouper en unités de coordonnées. Après cela, si vous appliquez une refonte,

img = img.reshape(9, -1)
print(img)

# [[ 0  9 18 27]
#  [ 3 12 21 30]
#  [ 6 15 24 33]
#  [ 1 10 19 28]
#  [ 4 13 22 31]
#  [ 7 16 25 34]
#  [ 2 11 20 29]
#  [ 5 14 23 32]
#  [ 8 17 26 35]]

C'est fait! Reshape (9, -1) est une façon d'écrire dans un format qui ne décide que de 9 lignes et qui remodèle automatiquement (utile lorsque le tableau est très grand), et bien sûr reshape (9, 4) est également OK.

Après tout, le processus précédent peut être représenté par une seule ligne, ** transpose (2, 3, 0, 1) .reshape (9, -1) **. Comme prévu, numpy.

Recommended Posts

numpy memorandum 2 / transpose n'échange pas seulement les lignes et les colonnes
[Python] Permutation des lignes et des colonnes de données Numpy
Ajouter des totaux aux lignes et aux colonnes avec des pandas