Secciones de arrays

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


In [1]:
import numpy as np

Arrays de una dimensión


In [2]:
arr = np.arange(10)
arr


Out[2]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [3]:
# Accediendo al primer elemento
arr[0]


Out[3]:
0

In [4]:
# Accediendo al último
arr[-1]


Out[4]:
9
¡Atención!

NumPy devuelve vistas de la sección que le pidamos, no copias. Esto quiere decir que debemos prestar mucha atención a este comportamiento:


In [5]:
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]

In [6]:
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:


In [7]:
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]

In [8]:
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:


In [9]:
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]

In [10]:
arr[5] = 999

print(arr)
print(a)


[  0   1   2   3   4 999   6   7   8   9]
[5 6 7 8 9]

Arrays de dos dimensiones


In [11]:
arr = np.arange(9).reshape([3, 3])
arr


Out[11]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [12]:
arr[0, -1]


Out[12]:
2

In [13]:
arr[2, 2]


Out[13]:
8

Secciones de arrays

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:


In [14]:
M = np.arange(36, dtype=float).reshape(4, 9)
M


Out[14]:
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.]])

In [15]:
# De la segunda a la tercera fila, incluida
M[1:3]


Out[15]:
array([[  9.,  10.,  11.,  12.,  13.,  14.,  15.,  16.,  17.],
       [ 18.,  19.,  20.,  21.,  22.,  23.,  24.,  25.,  26.]])

In [16]:
# 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


Out[16]:
array([[  1.,   3.],
       [ 10.,  12.]])
Ejercicio

Pintar un tablero de ajedrez usando la función plt.matshow.


In [17]:
tablero = np.zeros([8, 8], dtype=int)

tablero[0::2, 1::2] = 1
tablero[1::2, 0::2] = 1

tablero


Out[17]:
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]])

In [18]:
%matplotlib inline
import matplotlib.pyplot as plt

plt.matshow(tablero, cmap=plt.cm.gray_r)


Out[18]:
<matplotlib.image.AxesImage at 0xa178710>

Hemos aprendido:

  • A acceder a elementos de un array
  • Que las secciones no devuelven copias, sino vistas

¡Quiero más!Algunos enlaces:

Algunos enlaces en Pybonacci:

Algunos enlaces en otros sitios:



¡Síguenos en Twitter!



Este notebook ha sido realizado por: Juan Luis Cano y Álex Sáez



<span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Curso AeroPython</span> por <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Juan Luis Cano Rodriguez y Alejandro Sáez Mollejo</span> se distribuye bajo una Licencia Creative Commons Atribución 4.0 Internacional.