[PYTHON] numpy memorandum 2 / transponieren vertauscht nicht nur Zeilen und Spalten

1. Zuallererst

Ich habe nicht verstanden, wie man "transepose" im Detail verwendet, deshalb werde ich das Ergebnis meiner Untersuchung als Memorandum belassen.

2.2 dimensionale Anordnung

import numpy as np

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

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

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

Keine Konvertierung ist "transponieren (0, 1)", und die Achsnummern sind ** x-Achse (0), y-Achse (1) **. Mit "transponieren (1, 0)" werden die x-Achse (0) und die y-Achse (1) vertauscht, was zu einer sogenannten Translokationsmatrix führt.

3.3 dimensionales Array

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]]]

Keine Konvertierung ist "transponieren (0, 1, 2)", und die Achsnummern sind ** Kanalachse (0), x-Achse (1), y-Achse (2) ** (Kanalachse ist ein entsprechend angegebener Name). ist). Beachten Sie, dass sich die Achsnummern der x- und y-Achse entsprechend der Anzahl der Dimensionen ändern.

transponieren (0, 2, 1) vertauscht die x-Achse (1) und die y-Achse (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]]]

Wenn man "transponieren (1, 0, 2)" und die x-Achse (1) vor die Kanalachse (0) bringt, wird sie früher in jeder Matrix verarbeitet, aber in jeder Matrix Verarbeitung zwischen **. Erstellen Sie eine Matrix in der 0. Zeile, 1 Matrix in der 1. Zeile und 1 Matrix in der 2. Zeile der beiden Matrizen.

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]]]

Wenn Sie "transponieren (2, 0, 1)" und die y-Achse (2) vor die Kanalachse (0) bringen, wird die Intermatrix-Verarbeitung wie zuvor ausgeführt. Erstellen Sie diesmal eine Matrix in der 0. Spalte der beiden Matrizen, 1 Matrix in der 1. Spalte und 1 Matrix in der 2. Spalte.

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]]]

Was ist nun, wenn wir sowohl die Transponierte (1, 2, 0) als auch die x-Achse (1), die y-Achse (2) vor die Kanalachse (0) bringen? ** Spießen Sie die Werte der gleichen Koordinaten in jeder Matrix auf **.

Diesmal ist die x-Achse (0) der Anfang (Priorität), sodass die 0. Reihe aufgespießt wird, um eine Matrix zu bilden, die 1. Reihe aufgespießt wird, um eine Matrix zu bilden, und die 2. Reihe aufgespießt wird, um eine Matrix zu bilden. Machen Sie eine Linie.

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]]]

Wenn Sie diesmal "transponieren (2, 1, 0)" und die y-Achse (2) an den Anfang bringen, hat die y-Achse (2) Vorrang, und die 0. Spalte wird aufgespießt, um eine Matrix zu erstellen. Versetzen Sie die erste Reihe, um eine Warteschlange zu bilden, und spießen Sie die zweite Reihe auf, um eine Warteschlange zu bilden.

4-dimensionales Array

Es ist endlich die 4. Dimension. Ich werde nur ein bemerkenswertes Beispiel erklären.

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]]]]

Keine Konvertierung ist "transponieren (0, 1, 2, 3)" und die Achsnummern sind ** Stapelachse (0), Kanalachse (1), x-Achse (2), y-Achse (3) ** ( Die Stapelachse und die Kanalachse sind entsprechend benannt.

Wenn Sie in einem 4-dimensionalen Array "transponieren (2, 3, 0, 1)", werden die gleichen Koordinaten jeder Matrix auf die gleiche Weise aufgespießt wie in einem 3-dimensionalen Array, aber die Aggregationseinheit ist keine Zeile, sondern eine Koordinateneinheit. Es wird sein. Dann sind die Koordinaten 0 Zeilen und 0 Spalten, 0 Zeilen und 1 Spalte, 0 Zeilen und 2 Spalten, 1 Zeile und 0 Spalten und so weiter.

Im Fall von "transponieren (3, 2, 0, 1)" wird die Reihenfolge der Koordinaten in 0 Zeile 0 Spalte, 1 Zeile 0 Spalte, 2 Zeile 0 Spalte, 0 Zeile 1 Spalte, ... geändert. Ist dasselbe.

4. Beispiel für die tatsächliche Verwendung

Ein einfaches Beispiel erklärt ein Beispiel, in dem die Transponierung in im2col verwendet wird, einem Algorithmus, der Faltungsoperationen mit hoher Geschwindigkeit ausführt. スクリーンショット 2020-02-08 11.32.22.png Wie kann ich von den vier Matrizen links in die Matrix rechts konvertieren?

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]]]]

Korrekt. Wenn Sie früher "transponieren (2, 3, 0, 1)" verwenden, können Sie jede Koordinate aufspießen und in Koordinateneinheiten zusammensetzen. Wenn Sie danach eine Umformung anwenden,

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]]

Es ist fertig! Reshape (9, -1) ist eine Schreibweise in einem Format, das nur 9 Zeilen festlegt und dann automatisch umformt (nützlich, wenn das Array sehr groß ist), und natürlich ist reshape (9, 4) auch in Ordnung.

Immerhin kann der vorherige Prozess durch nur eine Zeile dargestellt werden: ** transponieren (2, 3, 0, 1) .form (9, -1) **. Wie erwartet, numpy.

Recommended Posts

numpy memorandum 2 / transponieren vertauscht nicht nur Zeilen und Spalten
[Python] Vertauschen von Zeilen und Spalten mit Numpy-Daten
Fügen Sie mit Pandas Summen zu Zeilen und Spalten hinzu