Fondamentalmente ciò che la funzione di trasposizione fa è scambiare la forma e i passi dell'array:
>>> a = np.ones((1,2,3))
>>> a.shape
(1, 2, 3)
>>> a.T.shape
(3, 2, 1)
>>> a.strides
(48, 24, 8)
>>> a.T.strides
(8, 24, 48)
Nel caso di array numpy 1D (array di rango 1) la forma e i passi sono tuple a 1 elemento e non possono essere scambiati, e la trasposizione di tale array 1D lo restituisce invariato. Invece, puoi trasporre un "vettore di riga" (matrice numpy di forma (1, n)
) in un "vettore di colonna" (matrice numpy di forma (n, 1)
). Per raggiungere questo obiettivo, devi prima convertire l'array numpy 1D in vettore riga e quindi scambiare la forma e i passi (trasponilo). Di seguito è una funzione che lo fa:
from numpy.lib.stride_tricks import as_strided
def transpose(a):
a = np.atleast_2d(a)
return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])
Esempio:
>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> transpose(a)
array([[0],
[1],
[2]])
>>> a = np.arange(1, 7).reshape(2,3)
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> transpose(a)
array([[1, 4],
[2, 5],
[3, 6]])
Ovviamente non è necessario farlo in questo modo poiché si dispone di un array 1D e è possibile rimodellarlo direttamente in (n, 1)
array con a.reshape((-1, 1))
o a[:, None]
. Volevo solo dimostrare come funziona la trasposizione di un array.