Arreglos bidimensionales - Inicioprogra.usm.cl/diapos/15-arreglos-2d-notas.pdf · Los arreglos...

4
Arreglos bidimensionales Programaci ´ on http://progra.usm.cl Objetivos de la clase Presentar el concepto de arreglo bidimensional. Ense ˜ nar algunas operaciones b ´ asicas de los arreglos bidimensionales de NumPy. Diapositivas Los arreglos que vimos en la clase anterior son secuencias lineales de valores. Los arreglos bidimensionales, por otra parte, son tablas de valores. Cada elemento de un arreglo bidi- mensional est ´ a simult ´ aneamente en una fila y en una columna. Posiblemente, muchos alumnos no hayan visto a ´ un en alg ´ un curso de matem´ aticas el concepto de ma- triz. Mencione que ✭✭matriz✮✮ es simplemente otro nombre para referirse a los arreglos bidimensionales. Al menos en programaci ´ on, ambos t´ erminos pueden ser considerados sin ´ onimos. La mayor´ ıa de los conceptos ense ˜ nados en la clase anterior son aplicables tambi´ en a los arreglos bi- dimensionales. Por ejemplo, las operaciones se hacen t´ ermino a t´ ermino, se puede modificar elementos o regiones del arreglo, y todos los elementos son del mismo tipo. Arreglos bidimensionales >>> from numpy import * >>> a = array([[5.1, 7.4, 3.2, 9.9], ... [1.9, 6.8, 4.1, 2.3], ... [2.9, 6.4, 4.3, 1.4]]) >>> a.shape (3, 4) >>> a.size 12 La manera de crear un arreglo bidimensional indicando sus valores expl´ ıcitamente es pasar una lista de listas a la funci ´ on array. Cada una de las listas interiores representa una fila de la matriz. Las listas deben ser todas del mismo largo, o si no ocurrir´ a un error de valor. Todos los arreglos tienen un atributo shape que indica su forma. Es una tupla con los tama ˜ nos a lo largo de cada dimensi ´ on. En el caso de los arreglos bidimensionales, los valores de la tupla son los n ´ umeros de filas y de columnas. T´ ıpicamente, un algoritmo que debe recorrer los elementos de la matriz comienza con m, n = a.shape. El valor del atributo size es la cantidad de elementos que tiene el arreglo, independiente de su forma. Ojo con la funci ´ on len, que no entrega el tama ˜ no del arreglo, sino el n ´ umero de filas. 1

Transcript of Arreglos bidimensionales - Inicioprogra.usm.cl/diapos/15-arreglos-2d-notas.pdf · Los arreglos...

Page 1: Arreglos bidimensionales - Inicioprogra.usm.cl/diapos/15-arreglos-2d-notas.pdf · Los arreglos bidimensionales, por otra parte, son tablas de valores. Cada elemento de un arreglo

Arreglos bidimensionales

Programacionhttp://progra.usm.cl

Objetivos de la clase

Presentar el concepto de arreglo bidimensional.

Ensenar algunas operaciones basicas de los arreglos bidimensionales de NumPy.

Diapositivas

Los arreglos que vimos en la clase anterior son secuencias lineales de valores.Los arreglos bidimensionales, por otra parte, son tablas de valores. Cada elemento de un arreglo bidi-

mensional esta simultaneamente en una fila y en una columna.Posiblemente, muchos alumnos no hayan visto aun en algun curso de matematicas el concepto de ma-

triz. Mencione que ((matriz)) es simplemente otro nombre para referirse a los arreglos bidimensionales. Almenos en programacion, ambos terminos pueden ser considerados sinonimos.

La mayorıa de los conceptos ensenados en la clase anterior son aplicables tambien a los arreglos bi-dimensionales. Por ejemplo, las operaciones se hacen termino a termino, se puede modificar elementos oregiones del arreglo, y todos los elementos son del mismo tipo.

Arreglos bidimensionales

>>> from numpy import *

>>> a = array([[5.1, 7.4, 3.2, 9.9],... [1.9, 6.8, 4.1, 2.3],... [2.9, 6.4, 4.3, 1.4]])

>>> a.shape(3, 4)

>>> a.size12

La manera de crear un arreglo bidimensional indicando sus valores explıcitamente es pasar una lista delistas a la funcion array. Cada una de las listas interiores representa una fila de la matriz. Las listas debenser todas del mismo largo, o si no ocurrira un error de valor.

Todos los arreglos tienen un atributo shape que indica su forma. Es una tupla con los tamanos a lo largode cada dimension. En el caso de los arreglos bidimensionales, los valores de la tupla son los numeros defilas y de columnas. Tıpicamente, un algoritmo que debe recorrer los elementos de la matriz comienza conm, n = a.shape.

El valor del atributo size es la cantidad de elementos que tiene el arreglo, independiente de su forma.Ojo con la funcion len, que no entrega el tamano del arreglo, sino el numero de filas.

1

Page 2: Arreglos bidimensionales - Inicioprogra.usm.cl/diapos/15-arreglos-2d-notas.pdf · Los arreglos bidimensionales, por otra parte, son tablas de valores. Cada elemento de un arreglo

Otras maneras de crear arreglos 2D

>>> zeros((3, 2))array([[ 0., 0.],

[ 0., 0.],[ 0., 0.]])

>>> ones((2, 5))array([[ 1., 1., 1., 1., 1.],

[ 1., 1., 1., 1., 1.]])

Las funciones zeros y ones tambien permiten crear arreglos de mas de una dimension. Para esto, debepasarse la tupla con la forma del arreglo como argumento.

Esta regla se aplica tambien a la mayorıa de las funciones que reciben dimensiones de arreglos comoparametros. Por ejemplo, la funcion numpy.random.random tambien acepta una tupla como parametro.

Cambiar la forma del arreglo

>>> a = arange(12)

>>> aarray([ 0, 1, 2, 3, 4, 5, 6, 7, 8,9, 10, 11])

>>> a.reshape((4, 3))array([[ 0, 1, 2],

[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])

>>> a.reshape((2, 6))array([[ 0, 1, 2, 3, 4, 5],

[ 6, 7, 8, 9, 10, 11]])

El metodo reshape de los arreglos retorna un arreglo que tiene los mismos elementos pero con otraforma. El reordenamiento se hace siempre a lo largo de las filas.

El parametro de reshape es una tupla indicando la nueva forma del arreglo. El numero de elementosen la nueva forma (es decir, el producto de los elementos de la tupla) debe coincidir con el tamano delarreglo.

Note que el arreglo original no es modificado, sino que un arreglo nuevo es retornado. Sin embargo,ambos arreglos comparten el buffer de datos, por lo que al modificar uno de los arreglos, los cambios seven reflejados tambien en el otro. En general esto es ası en las operaciones de NumPy: las operaciones dearreglos entregan vistas a arreglos existentes, no copias de arreglos.

Elementos y secciones del arreglo

>>> a = array([[ 0.11, 0.99, 0.96, 0.26],... [ 0.24, 0.79, 0.40, 0.31],... [ 0.72, 0.43, 0.43, 0.28],... [ 0.76, 0.02, 0.95, 0.49]])

>>> a[2, 3]0.28

>>> a[2, :]array([ 0.72, 0.43, 0.43, 0.28])

>>> a[1:3, 0:4:2]array([[ 0.24, 0.40],

[ 0.72, 0.43]])

Los arreglos se indexan usando tuplas i, j (al igual que Pascal, y a diferencia de C, donde se ocupandos pares de corchetes). a[i, j] es el elemento en la fila i y la columna j.

En el primer ejemplo, se obtiene el elemento en la posicion (2, 3).En el segundo ejemplo, se obtiene la fila 2 completa del arreglo. Esto se hace indicando que el ındice de

las columnas toma todos los valores posibles. La sintaxis : significa ((desde el principio hasta el final)). Elejemplo tambien podrıa haber sido escrito como a[2, 0:4].

El tercer ejemplo entrega una region mas complicada del arreglo.

2

Page 3: Arreglos bidimensionales - Inicioprogra.usm.cl/diapos/15-arreglos-2d-notas.pdf · Los arreglos bidimensionales, por otra parte, son tablas de valores. Cada elemento de un arreglo

Ejercicio: crear arreglos

Crear los siguientes arreglos:

9 9 9 9 99 9 9 9 99 9 0 9 99 9 9 9 99 9 9 9 9

8 8 8 8 88 8 8 8 88 8 8 8 81 1 1 1 18 8 8 8 8

8 8 8 8 88 8 8 8 88 8 8 8 80 1 2 3 48 8 8 8 8

5 5 5 5 55 0 0 0 55 0 0 0 55 0 0 0 55 5 5 5 5

0 1 2 3 44 3 2 1 00 1 2 3 44 3 2 1 00 1 2 3 4

1 2 3 1 23 1 2 3 12 3 1 2 31 2 3 1 23 1 2 3 1

Resuelva estos ejercicios con calma y detalladamente, hasta que quede claro como ocupar las operacio-nes ensenadas anteriormente.

Las soluciones a los problemas estan en los archivos anexos al material de clases.

Transponer arreglo

>>> a = arange(12).reshape((3, 4))>>> aarray([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],[ 8, 9, 10, 11]])

>>> a.transpose()array([[ 0, 4, 8],

[ 1, 5, 9],[ 2, 6, 10],[ 3, 7, 11]])

La transposicion consiste en cambiar filas por columnas y viceversa. El efecto de la operacion es compa-rable a usar la diagonal como un espejo.

La transposicion se obtiene usando el metodo transpose, y entrega una vista al arreglo existente.Por conveniencia, NumPy permite obtener la transpuesta mediante la sintaxis a.T, pero es preferible no

ensenar esto para mantener la consistencia en las operaciones, y no obligar a los alumnos a estar pendientesde cuales operaciones son metodos y cuales no.

Diagonales

>>> aarray([[ 4.1 , 4.5625, 5.025 ],

[ 5.4875, 5.95 , 6.4125],[ 6.875 , 7.3375, 7.8 ]])

>>> diag(a)array([ 4.1 , 5.95, 7.8 ])

>>> diag(a, 1)array([ 4.5625, 6.4125])

La funcion diag permite obtener la diagonal de un arreglo bidimensional. Ademas de la diagonal prin-cipal, es posible obtener otras diagonales pasando un segundo parametro a la funcion.

No se muestra en el ejemplo, pero la misma funcion diag permite hacer la operacion inversa: al recibirun arreglo de una dimension, entrega un arreglo bidimensional con sus elementos a lo largo de la diagonal.

3

Page 4: Arreglos bidimensionales - Inicioprogra.usm.cl/diapos/15-arreglos-2d-notas.pdf · Los arreglos bidimensionales, por otra parte, son tablas de valores. Cada elemento de un arreglo

Ejercicio: cuadrado magico

Una matriz es un cuadrado magico si las sumas de cada fila,de cada columna y de las dos diagonales son iguales.Por ejemplo:

m =

4 15 14 19 6 7 125 10 11 816 3 2 13

Escriba una funcion que indiquesi una matriz es o no un cuadrado magico:

>>> es_magico(m)True

Lea el enunciado del ejercicio en voz alta. En el cuadrado magico del ejemplo, todas las filas, columnasy diagonales suman 34. Para ilustrar la propiedad de los cuadrados magicos, haga algunas de las sumaspara mostrar que son iguales.

Discuta con los estudiantes las estrategias para resolver el problema, y procure que ellos vayan propo-niendo las operaciones concretas a realizar.

La parte comparativamente mas difıcil es obtener los elementos de la antidiagonal, ya que no hay nin-guna funcion para obtenerlos directamente. Una posible idea (erronea) es obtener la diagonal de la matriztranspuesta, pero esto no sirve, ya que la transposicion no altera la diagonal de la matriz.

El problema resuelto de varias maneras distintas esta en los archivos anexos.

4