Transponieren von Arrays und Vertauschen von Achsen

Transponieren ist eine spezielle Form der Umformung, die ebenfalls eine Sicht auf die zugrunde liegenden Daten liefert, ohne etwas zu kopieren. Arrays haben die Transpose-Methode und auch das spezielle T-Attribut:

[1]:
import numpy as np
[2]:
data = np.arange(16)
[3]:
data
[3]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
[4]:
reshaped_data = data.reshape((4, 4))
[5]:
reshaped_data
[5]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
[6]:
reshaped_data.T
[6]:
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])

numpy.dot gibt das Skalarprodukt zweier Arrays zurück, z.B.:

[7]:
np.dot(reshaped_data.T, reshaped_data)
[7]:
array([[224, 248, 272, 296],
       [248, 276, 304, 332],
       [272, 304, 336, 368],
       [296, 332, 368, 404]])

Der @ Infix-Operator ist eine weitere Möglichkeit, eine Matrixmultiplikation durchzuführen. Er implementiert die Semantik des @-Operators, der mit PEP 465 in Python 3.5 eingeführt wurde und ist eine Abkürzung von np.matmul.

[8]:
data.T @ data
[8]:
1240

Bei höherdimensionalen Arrays akzeptiert transpose ein Tupel von Achsennummern, um die Achsen zu vertauschen:

[9]:
array_3d = np.arange(16).reshape((2, 2, 4))
[10]:
array_3d
[10]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
[11]:
array_3d.transpose((1, 0, 2))
[11]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

Hier wurden die Achsen neu geordnet, wobei die zweite Achse an erster Stelle steht, die erste Achse an zweiter Stelle und die letzte Achse unverändert bleibt.

ndarray verfügt auch über eine Methode swapaxes, die ein Paar von Achsennummern nimmt und die angegebenen Achsen vertauscht, um die Daten neu anzuordnen:

[12]:
array_3d.swapaxes(1, 2)
[12]:
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])