NumPy - Indexación avanzada
Es posible hacer una selección de ndarray que sea una secuencia que no sea de tupla, un objeto ndarray de tipo de datos entero o booleano, o una tupla con al menos un elemento que sea un objeto de secuencia. La indexación avanzada siempre devuelve una copia de los datos. En contra de esto, el corte solo presenta una vista.
Hay dos tipos de indexación avanzada: Integer y Boolean.
Indexación de enteros
Este mecanismo ayuda a seleccionar cualquier elemento arbitrario en una matriz en función de su índice Ndimensional. Cada matriz de enteros representa el número de índices en esa dimensión. Cuando el índice consta de tantas matrices de enteros como las dimensiones del ndarray de destino, se vuelve sencillo.
En el siguiente ejemplo, se selecciona un elemento de la columna especificada de cada fila del objeto ndarray. Por lo tanto, el índice de fila contiene todos los números de fila y el índice de columna especifica el elemento que se seleccionará.
Ejemplo 1
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print y
Su salida sería la siguiente:
[1 4 5]
La selección incluye elementos en (0,0), (1,1) y (2,0) de la primera matriz.
En el siguiente ejemplo, se seleccionan los elementos colocados en las esquinas de una matriz de 4X3. Los índices de fila de selección son [0, 0] y [3,3] mientras que los índices de columna son [0,2] y [0,2].
Ejemplo 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
El resultado de este programa es el siguiente:
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 selección resultante es un objeto ndarray que contiene elementos de esquina.
La indexación avanzada y básica se puede combinar usando un segmento (:) o puntos suspensivos (…) con una matriz de índice. En el siguiente ejemplo, se utiliza un segmento para la fila y un índice avanzado para la columna. El resultado es el mismo cuando se usa slice para ambos. Pero el índice avanzado da como resultado una copia y puede tener un diseño de memoria diferente.
Ejemplo 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
El resultado de este programa sería el siguiente:
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]]
Indexación de matriz booleana
Este tipo de indexación avanzada se utiliza cuando el objeto resultante está destinado a ser el resultado de operaciones booleanas, como los operadores de comparación.
Ejemplo 1
En este ejemplo, los elementos superiores a 5 se devuelven como resultado de la indexación 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]
El resultado de este programa sería:
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]
Ejemplo 2
En este ejemplo, los elementos NaN (Not a Number) se omiten usando ~ (operador de complemento).
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print a[~np.isnan(a)]
Su salida sería -
[ 1. 2. 3. 4. 5.]
Ejemplo 3
El siguiente ejemplo muestra cómo filtrar los elementos no complejos de una matriz.
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print a[np.iscomplex(a)]
Aquí, la salida es la siguiente:
[2.0+6.j 3.5+5.j]