Skip to content

NumPy: Trasporre ndarray (scambiare righe e colonne, riorganizzare gli assi)

Python

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