Hasta ahora sabemos cómo crear arrays y realizar algunas operaciones con ellos, sin embargo, todavía no hemos aprendido cómo acceder a elementos concretos del array
import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# Accediendo al primer elemento
arr[0]
0
# Accediendo al último
arr[-1]
9
NumPy devuelve vistas de la sección que le pidamos, no copias. Esto quiere decir que debemos prestar mucha atención a este comportamiento:
arr = np.arange(10)
a = arr[5:]
print(arr)
print(a)
[0 1 2 3 4 5 6 7 8 9] [5 6 7 8 9]
arr[5] = 999
print(arr)
print(a)
[ 0 1 2 3 4 999 6 7 8 9] [999 6 7 8 9]
Lo mismo ocurre al revés:
arr = np.arange(10)
a = arr[5:]
print(arr)
print(a)
[0 1 2 3 4 5 6 7 8 9] [5 6 7 8 9]
a[-1] = 999
print(arr)
print(a)
[ 0 1 2 3 4 5 6 7 8 999] [ 5 6 7 8 999]
a
apunta a las direcciones de memoria donde están guardados los elementos del array arr
que hemos seleccionado, no copia sus valores, a menos que explícitamente hagamos:
arr = np.arange(10)
a = arr[5:].copy()
print(arr)
print(a)
[0 1 2 3 4 5 6 7 8 9] [5 6 7 8 9]
arr[5] = 999
print(arr)
print(a)
[ 0 1 2 3 4 999 6 7 8 9] [5 6 7 8 9]
arr = np.arange(9).reshape([3, 3])
arr
array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr[0, -1]
2
arr[2, 2]
8
Hasta ahora hemos visto cómo acceder a elementos aislados del array, pero la potencia de NumPy está en poder acceder a secciones enteras. Para ello se usa la sintaxis inicio:final:paso
: si alguno de estos valores no se pone toma un valor por defecto. Veamos ejemplos:
M = np.arange(36, dtype=float).reshape(4, 9)
M
array([[ 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., 32., 33., 34., 35.]])
# De la segunda a la tercera fila, incluida
M[1:3]
array([[ 9., 10., 11., 12., 13., 14., 15., 16., 17.], [ 18., 19., 20., 21., 22., 23., 24., 25., 26.]])
# Hasta la tercera fila sin incluir y de la segunda a la quinta columnas saltando dos
M[:2, 1:5:2]
#M[1:2:1, 1:5:2] # Equivalente
array([[ 1., 3.], [ 10., 12.]])
Pintar un tablero de ajedrez usando la función plt.matshow
.
tablero = np.zeros([8, 8], dtype=int)
tablero[0::2, 1::2] = 1
tablero[1::2, 0::2] = 1
tablero
array([[0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0]])
%matplotlib inline
import matplotlib.pyplot as plt
plt.matshow(tablero, cmap=plt.cm.gray_r)
<matplotlib.image.AxesImage at 0x7fe142f19550>
___Hemos aprendido:___
__¡Quiero más!__Algunos enlaces:
Algunos enlaces en Pybonacci:
Algunos enlaces en otros sitios:
Las siguientes celdas contienen configuración del Notebook
Para visualizar y utlizar los enlaces a Twitter el notebook debe ejecutarse como seguro
File > Trusted Notebook
# Esta celda da el estilo al notebook
from IPython.core.display import HTML
css_file = '../styles/aeropython.css'
HTML(open(css_file, "r").read())