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.