Indexación avanzada de NumPy

NumPy ofrece más formas de indexación que las secuencias típicas de Python.

Además de la indexación con enteros y cortes vista anteriormente, las matrices pueden indexarse mediante matrices de enteros, indexación booleana e indexación fancy.

La indexación avanzada en NumPy se refiere al uso de matrices de enteros, matrices booleanas u otras secuencias para acceder a los elementos de una matriz. En comparación con la indexación básica, la indexación avanzada puede acceder a cualquier elemento de la matriz y también se puede utilizar para realizar operaciones y modificaciones complejas en la matriz.

Indexación con matrices de enteros

La indexación con matrices de enteros consiste en utilizar una matriz para acceder a los elementos de otra matriz. Cada elemento de esta matriz es un valor de índice en alguna dimensión de la matriz objetivo.

El siguiente ejemplo obtiene en la matriz los(0,0),(1,1)y(2,0)elementos en las posiciones.

Ejemplo

import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] print (y)

El resultado de salida es:

[1  4  5]

El siguiente ejemplo obtiene los elementos de las cuatro esquinas de una matriz de 4X3. Los índices de fila son [0,0] y [3,3], y los índices de columna son [0,2] y [0,2].

Ejemplo

import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('Nuestra matriz es:' ) print (x) print ('\n') rows = np.array([[0,0],[3,3]]) cols = np.array([[0,2],[0,2]]) y = x[rows,cols] print ('Los elementos de las cuatro esquinas de esta matriz son:') print (y)

El resultado de salida es:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


这个数组的四个角元素是:
[[ 0  2]
 [ 9 11]]

El resultado devuelto es un objeto ndarray que contiene los elementos de cada esquina.

Se puede, mediante el corte,:o…combinar con matrices de índice. Como en el siguiente ejemplo:

Ejemplo

import numpy as np a = np.array([[1,2,3], [4,5,6],[7,8,9]]) b = a[1:3, 1:3] c = a[1:3,[1,2]] d = a[...,1:] print(b) print(c) print(d)

El resultado de salida es:

[[5 6]
 [8 9]]
[[5 6]
 [8 9]]
[[2 3]
 [5 6]
 [8 9]]

Indexación booleana

Podemos indexar la matriz objetivo mediante una matriz booleana.

La indexación booleana utiliza operaciones booleanas (como operadores de comparación) para obtener los elementos de una matriz que cumplen una condición especificada.

El siguiente ejemplo obtiene los elementos mayores que 5:

Ejemplo

import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('Nuestra matriz es:') print (x) print ('\n') # Ahora imprimiremos los elementos mayores que 5 print ('Los elementos mayores que 5 son:') print (x[x > 5])

El resultado de salida es:

我们的数组是:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


大于 5 的元素是:
[ 6  7  8  9 10 11]

El siguiente ejemplo utiliza~(operador de complemento) para filtrar NaN.

Ejemplo

import numpy as np a = np.array([np.nan, 1,2,np.nan,3,4,5]) print (a[~np.isnan(a)])

El resultado de salida es:

[ 1.   2.   3.   4.   5.]

El siguiente ejemplo demuestra cómo filtrar los elementos que no son complejos de una matriz.

Ejemplo

import numpy as np a = np.array([1, 2+6j, 5, 3.5+5j]) print (a[np.iscomplex(a)])

La salida es la siguiente:

[2.0+6.j  3.5+5.j]

Indexación fancy

La indexación fancy se refiere a la indexación utilizando matrices de enteros.

La indexación fancy toma valores utilizando los valores del arreglo de índices como subíndices de un determinado eje de la matriz objetivo.

Cuando se utiliza una matriz unidimensional de enteros como índice, si el objetivo es una matriz unidimensional, el resultado de la indexación son los elementos en las posiciones correspondientes; si el objetivo es una matriz bidimensional, entonces son las filas correspondientes a los subíndices.

La indexación fancy, a diferencia del corte, siempre copia los datos a una nueva matriz.

Matriz unidimensional

Una matriz unidimensional tiene solo un ejeaxis = 0, por lo que la matriz unidimensional se indexaaxis = 0sobre este eje:

Ejemplo

import numpy as np

x = np.arange(9)
print(x)
# La matriz unidimensional lee el elemento correspondiente al subíndice especificado
print(-------Leer el elemento correspondiente al índice-------)
x2 = x[[0, 6]] # Usando indexación fancy
print(x2)

print(x2[0])
print(x2[1])

El resultado de salida es:

[0 1 2 3 4 5 6 7 8]
-------读取下标对应的元素-------
[0 6]
0
6

Matriz bidimensional

1. Pasar un arreglo de índices en orden

Ejemplo

import numpy as np x=np.arange(32).reshape((8,4)) print(x) # La matriz bidimensional lee las filas correspondientes a los subíndices especificados print("-------Leer las filas correspondientes a los índices-------") print (x[[4,2,1,7]])

print (x[[4,2,1,7]])La salida para los subíndices4, 2, 1, 7correspondientes a las filas es la siguiente:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
-------读取下标对应的行-------
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]

2. Pasar un arreglo de índices en orden inverso

Ejemplo

import numpy as np x=np.arange(32).reshape((8,4)) print (x[[-4,-2,-1,-7]])

El resultado de salida es:

[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]

3. Pasar múltiples arreglos de índices (se debe usar np.ix_)

La función np.ix_ consiste en tomar dos arreglos y generar la relación de mapeo del producto cartesiano.

El producto cartesiano se refiere, en matemáticas, al producto cartesiano de dos conjuntos X e Y (Cartesian product), también llamado producto directo, y se representa comoX×Y, el primer objeto es un miembro de X, y el segundo objeto es un miembro de todos los posibles pares ordenados de Y.

Por ejemploA={a,b}, B={0,1,2}, entonces:

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

Ejemplo

import numpy as np x=np.arange(32).reshape((8,4)) print (x[np.ix_([1,5,7,2],[0,3,1,2])])

El resultado de salida es:

[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]
Otras extensiones