
Per trasporre l’array NumPy ndarray (scambiare righe e colonne), utilizzare l’attributo T (.T), il metodo ndarray transpose() e la funzione numpy.transpose().
Con ndarray.transpose() e numpy.transpose(), non solo puoi trasporre un array 2D (matrice) ma anche riorganizzare gli assi di un array multidimensionale in qualsiasi ordine.
In questo articolo vengono descritti i seguenti contenuti.
- Trasporre matrice bidimensionale (matrice)
- Attributo T
- ndarray.transpose()
- np.transpose()
- Matrice 1D e vettore riga, vettore colonna
- Scambia gli assi dell’array multidimensionale (3D o superiore)
- Risultato predefinito
- Specifica l’ordine degli assi con transpose()
- Esempio: trasporre più matrici contemporaneamente
Se desideri scambiare righe e colonne di pandas.DataFrame o un elenco bidimensionale (elenco di elenchi), vedere l’articolo seguente.
Trasporre matrice bidimensionale (matrice)
Attributo T
È possibile ottenere la matrice trasposta dell’array bidimensionale originale (matrice) con l’attributo T.
import numpy as np
a_2d = np.arange(6).reshape(2, 3)
print(a_2d)
# [[0 1 2]
# [3 4 5]]
a_2d_T = a_2d.T
print(a_2d_T)
# [[0 3]
# [1 4]
# [2 5]]
L’attributo T originale restituisce una vista dell’array e la modifica di uno cambia l’altro.
Puoi controllare se ndarray si riferisce a dati nella stessa memoria con np.shares_memory().
print(np.shares_memory(a_2d, a_2d_T))
# True
a_2d_T[0, 1] = 100
print(a_2d_T)
# [[ 0 100]
# [ 1 4]
# [ 2 5]]
print(a_2d)
# [[ 0 1 2]
# [100 4 5]]
a_2d[1, 0] = 3
print(a_2d)
# [[0 1 2]
# [3 4 5]]
print(a_2d_T)
# [[0 3]
# [1 4]
# [2 5]]
Se vuoi elaborarli come dati separati, fai una copia con copy().
a_2d_T_copy = a_2d.T.copy()
print(a_2d_T_copy)
# [[0 3]
# [1 4]
# [2 5]]
print(np.shares_memory(a_2d, a_2d_T_copy))
# False
a_2d_T_copy[0, 1] = 100
print(a_2d_T_copy)
# [[ 0 100]
# [ 1 4]
# [ 2 5]]
print(a_2d)
# [[0 1 2]
# [3 4 5]]
ndarray.transpose()
transpose() è fornito come metodo di ndarray. Come T, viene restituita la vista.
print(a_2d.transpose())
# [[0 3]
# [1 4]
# [2 5]]
print(np.shares_memory(a_2d, a_2d.transpose()))
# True
np.transpose()
Viene fornito anche la funzione numpy.transpose(). Specificare l’array originale sul primo argomento. Questo include anche una vista.
print(np.transpose(a_2d))
# [[0 3]
# [1 4]
# [2 5]]
print(np.shares_memory(a_2d, np.transpose(a_2d)))
# True
Matrice 1D e vettore riga, vettore colonna
L’applicazione di T o transpose() a un array unidimensionale richiede solo un array equivalente all’array originale.
a_1d = np.arange(3)
print(a_1d)
# [0 1 2]
print(a_1d.T)
# [0 1 2]
print(a_1d.transpose())
# [0 1 2]
print(np.transpose(a_1d))
# [0 1 2]
Una matrice con una sola riga è chiamata vettore di riga e una matrice con colonna è chiamata vettore di colonna, ma non c’è una matrice distinguere tra righe e colonne in una matrice unidimensionale di ndarray.
Un array bidimensionale utilizzato viene per indicare chiaramente che sono presenti solo righe o colonne.
Qui, trasforma la forma usando reshape().
a_row = a_1d.reshape(1, -1)
print(a_row)
# [[0 1 2]]
print(a_row.shape)
# (1, 3)
print(a_row.ndim)
# 2
a_col = a_1d.reshape(-1, 1)
print(a_col)
# [[0]
# [1]
# [2]]
print(a_col.shape)
# (3, 1)
print(a_col.ndim)
# 2
Come accennato in precedenza, gli array bidimensionali possono essere trasposti.
print(a_row.T)
# [[0]
# [1]
# [2]]
print(a_col.T)
# [[0 1 2]]
Scambia gli assi dell’array multidimensionale (3D o superiore)
Risultato predefinito
T, transpose() può essere applicato ad array multidimensionali di 3D o superiore.
Il risultato predefinito è il seguente. np.transpose() ha lo stesso risultato.
a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(a_3d.T)
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(a_3d.T.shape)
# (4, 3, 2)
print(a_3d.transpose())
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(a_3d.transpose().shape)
# (4, 3, 2)
È difficile da capire solo guardando il risultato di output, ma l’ordine dell’asse (dimensione) di (0° asse, 1° asse, 2° asse) è invertito come (2° asse, 1° asse, 0° asse) ).
In una matrice 2D, l’ordine di (0° asse, 1° asse) = (riga, colonna) viene modificato nell’ordine di (1° asse, 0° asse) = (colonna, riga).
Specifica l’ordine degli assi con transpose()
L’uso di T inverte sempre l’ordine, ma è possibile specificare qualsiasi ordine utilizzando transpose().
Nell’esempio seguente, specifica lo stesso ordine invertito di quello predefinito e conferma che il risultato non cambia.
Nel metodo ndarray transpose(), specifica l’ordine degli assi con argomenti di lunghezza variabile o tupla.
print(a_3d.transpose(2, 1, 0))
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(a_3d.transpose(2, 1, 0).shape)
# (4, 3, 2)
print(a_3d.transpose((2, 1, 0)).shape)
# (4, 3, 2)
In np.transpose(), specifica l’ordine come secondo argomento con tupla. Non può essere specificato con argomenti di lunghezza variabile.
print(np.transpose(a_3d, (2, 1, 0)))
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(np.transpose(a_3d, (2, 1, 0)).shape)
# (4, 3, 2)
# print(np.transpose(a_3d, 2, 1, 0))
# TypeError: transpose() takes from 1 to 2 positional arguments but 4 were given
Viene generato un errore se il numero di assi specificati non corrisponde al numero di dimensioni della matrice originale o se viene specificata una dimensione che non esiste.
# print(a_3d.transpose(0, 1))
# ValueError: axes don't match array
# print(a_3d.transpose(0, 1, 2, 3))
# ValueError: axes don't match array
# print(a_3d.transpose(0, 1, 3))
# AxisError: axis 3 is out of bounds for array of dimension 3
Esempio: trasporre più matrici contemporaneamente
Ad esempio, transpose() è utile quando un array 3D è un gruppo di array 2D.
Se i dati delle matrici vengono archiviati come un array 3D di forma (n, riga, colonna), tutte le matrici possono essere trasposte come segue.
print(a_3d)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(a_3d.shape)
# (2, 3, 4)
print(a_3d.transpose(0, 2, 1))
# [[[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
#
# [[12 16 20]
# [13 17 21]
# [14 18 22]
# [15 19 23]]]
print(a_3d.transpose(0, 2, 1).shape)
# (2, 4, 3)
Se la forma è (riga, colonna, n), puoi fare come segue.
print(a_3d.transpose(1, 0, 2))
# [[[ 0 1 2 3]
# [12 13 14 15]]
#
# [[ 4 5 6 7]
# [16 17 18 19]]
#
# [[ 8 9 10 11]
# [20 21 22 23]]]
print(a_3d.transpose(1, 0, 2).shape)
# (3, 2, 4)
print(a_3d[:, :, 0])
# [[ 0 4 8]
# [12 16 20]]
print(a_3d.transpose(1, 0, 2)[:, :, 0])
# [[ 0 12]
# [ 4 16]
# [ 8 20]]