NumPy - Indicizzazione avanzata
È possibile effettuare una selezione da ndarray che è una sequenza non tupla, un oggetto ndarray di tipo dati intero o booleano o una tupla con almeno un elemento che è un oggetto sequenza. L'indicizzazione avanzata restituisce sempre una copia dei dati. Al contrario, l'affettatura presenta solo una vista.
Esistono due tipi di indicizzazione avanzata: Integer e Boolean.
Indicizzazione di numeri interi
Questo meccanismo aiuta nella selezione di qualsiasi elemento arbitrario in un array in base al suo indice Ndimensional. Ogni matrice intera rappresenta il numero di indici in quella dimensione. Quando l'indice è composto da tanti array interi quante sono le dimensioni del ndarray di destinazione, diventa semplice.
Nell'esempio seguente, viene selezionato un elemento della colonna specificata da ciascuna riga dell'oggetto ndarray. Pertanto, l'indice di riga contiene tutti i numeri di riga e l'indice di colonna specifica l'elemento da selezionare.
Esempio 1
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print y
Il suo output sarebbe il seguente:
[1 4 5]
La selezione include elementi in (0,0), (1,1) e (2,0) dal primo array.
Nell'esempio seguente, vengono selezionati gli elementi posizionati agli angoli di una matrice 4X3. Gli indici di riga di selezione sono [0, 0] e [3,3] mentre gli indici di colonna sono [0,2] e [0,2].
Esempio 2
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print 'Our array is:'
print x
print '\n'
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print 'The corner elements of this array are:'
print y
L'output di questo programma è il seguente:
Our array is:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
The corner elements of this array are:
[[ 0 2]
[ 9 11]]
La selezione risultante è un oggetto ndarray contenente elementi angolari.
L'indicizzazione avanzata e quella di base possono essere combinate utilizzando una sezione (:) o puntini di sospensione (…) con un array di indici. L'esempio seguente utilizza slice per riga e indice avanzato per colonna. Il risultato è lo stesso quando si usa slice per entrambi. Ma l'indice avanzato produce una copia e può avere un layout di memoria diverso.
Esempio 3
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print 'Our array is:'
print x
print '\n'
# slicing
z = x[1:4,1:3]
print 'After slicing, our array becomes:'
print z
print '\n'
# using advanced index for column
y = x[1:4,[1,2]]
print 'Slicing using advanced index for column:'
print y
L'output di questo programma sarebbe il seguente:
Our array is:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
After slicing, our array becomes:
[[ 4 5]
[ 7 8]
[10 11]]
Slicing using advanced index for column:
[[ 4 5]
[ 7 8]
[10 11]]
Indicizzazione booleana di array
Questo tipo di indicizzazione avanzata viene utilizzato quando l'oggetto risultante deve essere il risultato di operazioni booleane, come gli operatori di confronto.
Esempio 1
In questo esempio, gli elementi maggiori di 5 vengono restituiti come risultato dell'indicizzazione booleana.
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print 'Our array is:'
print x
print '\n'
# Now we will print the items greater than 5
print 'The items greater than 5 are:'
print x[x > 5]
L'output di questo programma sarebbe:
Our array is:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
The items greater than 5 are:
[ 6 7 8 9 10 11]
Esempio 2
In questo esempio, gli elementi NaN (Not a Number) vengono omessi utilizzando ~ (operatore di complemento).
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print a[~np.isnan(a)]
Il suo output sarebbe -
[ 1. 2. 3. 4. 5.]
Esempio 3
L'esempio seguente mostra come filtrare gli elementi non complessi da un array.
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print a[np.iscomplex(a)]
Qui, l'output è il seguente:
[2.0+6.j 3.5+5.j]