Estrazione righe e colonne da un array in Python
Posso estrarre righe e colonne di un array in Python combinando le sintassi di slicing e indexing.
Ad esempio, definisco un array a due dimensioni tramite la funzione array() del modulo Numpy.
>>> import numpy as np
>>> M= np.array([[1,2,3],[4,5,6],[7,8,9]])
Si tratta di una matrice 3x3 con tre righe e tre colonne
$$ M = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} $$
Nei prossimi esempi estraggo le righe e le colonne dalla matrice.
Estrazione prima riga
Per estrarre la prima riga dell'array digito M[0,:]
>>> M[0,:]
array([1, 2, 3])
Tra le parentesi quadre indico il numero di riga e di colonna separati da una virgola.
In questo caso il primo parametro è 0 ossia la prima riga,
Il secondo parametro è il simbolo : che vuol dire seleziona tutte le colonne.
Nota. In Python il primo elemento di un array ha indice uguale a zero. Il secondo elemento ha indice uguale a uno. E via dicendo.
Avrei potuto anche scrivere semplicemente M[0] omettendo il secondo parametro.
>>> M[0]
array([1, 2, 3])
Il risultato sarebbe stato lo stesso.
Estrazione seconda riga
Se voglio estrarre la seconda riga dell'array digito M[1,:]
>>> M[1,:]
array([4, 5, 6])
Oppure in alternativa
>>> M[1]
array([4, 5, 6])
Estrazione terza riga
Se voglio estrarre la terza riga dell'array digito M[2,:]
>>> M[2,:]
array([7, 8, 9])
Estrazione prima colonna
Per estrarre la prima colonna dell'array digito M[:,0]
>>> M[:,0]
array([1, 4, 7])
In questo caso indico al primo parametro il simbolo : per selezionare tutte le righe.
Al secondo parametri indico il numero 0 per selezionare la prima colonna.
Estrazione seconda colonna
Per estrarre la seconda colonna digito M[:,1]
>>> M[:,1]
array([2, 5, 8])
Estrazione terza colonna
Per estrarre la terza colonna digito M[:,2]
>>> M[:,2]
array([3, 6, 9])
In alternativa, essendo l'ultima colonna dell'array avrei potuto estrarla anche tramite la sua posizione relativa (-1) senza indicare la posizione assoluta (3)
Se digito M[:,-1] ottengo lo stesso risultato
>>> M[:,-1]
array([3, 6, 9])
In questo caso -1 significa "ultima riga" perché si trova al secondo parametro,
Quindi per estrarre la penultima riga basta indicare -2
>>> M[:,-2]
array([2, 5, 8])
Nota. Allo stesso modo se voglio estrarre l'ultima riga della matrice tramite la sua posizione relativa dovrei scrivere M[-1,:]. Per estrarre la penultima riga M[-2,:]
Estrazione sottomatrice
Se voglio selezionare una sottomatrice devo indicare gli intervalli di righe e colonne da selezionare
Ad esempio, per selezionare le prime due righe e due colonne della matrice digito M[0:2,0:2]
>> M[0:2,0:2]
array([[1, 2],
[4, 5]])
Per selezionare la seconda e terza riga e la seconda e terza colonna della matrice digito M[1:3,1:3]
>>> M[1:3,1:3]
array([[5, 6],
[8, 9]])
Infine, se voglio selezionare due righe/colonne non contigue, devo indicare l'indice delle righe da selezionare tra parentesi quadre
Ad esempio, per selezionare la prima e la terza riga della matrice digito M[[0,2],:]
>> M[[0,2],:]
array([[1, 2, 3],
[7, 8, 9]])
Nel primo parametro indico le righe da selezionare [0,2] ossia la prima (0) e la terza (2)
Nel secondo parametro indico il simbolo : per selezionare tutte le colonne della matrice.
Posso anche selezionare le righe con passo alterno digitando M[::2,;]
>> M[::2,:]
array([[1, 2, 3],
[7, 8, 9]])
In questo caso il primo parametro è ::2 ossia 0::2.
Vuol dire che la selezione parte dalla prima riga (0:) e seleziona tutte le righe(:) con step 2.
Per questa ragione, seleziona la prima e la terza riga.
Attenzione. In tutti questi esempi ho creato delle viste (view) dell'array originale. Per creare una copia vera e propria del subarray() va aggiunto l'attributo copy(). Ad esempio, B=M[::2,:].copy() Per ogni ulteriore spiegazione rimando ai miei appunti sulla differenza tra vista e copia di un array.
E così via.