Pensamiento Computacional · Unidad 6 — Bibliotecas de Python
Bibliotecas y NumPy
Una biblioteca es código que ya está hecho. NumPy trae arrays, que se parecen a las listas pero operan sobre todos los elementos a la vez.
La explicación
Importar
import numpy as np → np.array(...)
from numpy import array → array(...)
La segunda forma es la convención universal. np para NumPy y pd para
Pandas se escriben así en todos lados; conviene respetarlo para que tu código se lea como el de
todo el mundo.
Arrays: parecen listas, pero no lo son
a = np.array([1, 2, 3])
Se indexa y se recorre igual. La diferencia está en las operaciones:
[1,2,3] * 2 → [1,2,3,1,2,3] repite la lista
[1,2] + [3,4] → [1,2,3,4] pega una atrás de otra
+ y el mismo
* hacen cosas distintas según qué tengas. Un programa que "da cualquier cosa" con
números suele ser una lista donde había que usar un array, o al revés.
Operar sin ciclo
Con listas, duplicar cada elemento pide un for. Con arrays no:
dobles = []
for n in numeros:
dobles.append(n * 2)
# array
dobles = numeros * 2
Eso se llama vectorizar, y además de ser más corto es muchísimo más rápido cuando hay muchos datos, porque la cuenta se hace por fuera de Python.
Funciones útiles
np.arange(0, 10, 2) como range, pero array
np.zeros(5) cinco ceros
Cuántas dimensiones y cuántos elementos
m = np.array([[1, 2, 3], [4, 5, 6]])
print(m.ndim) # 2: filas y columnas
print(m.shape) # (2, 3): 2 filas de 3
print(m.size) # 6: todos los elementos
print(len(m)) # 2: sólo cuenta las filas
Un array puede tener filas y columnas, como una tabla. ndim dice cuántas
dimensiones tiene (1 para una fila de números, 2 para una tabla), shape cuánto mide
cada una, y size cuántos elementos hay en total, que es el producto de los números de
shape. Ojo con len: en una tabla cuenta las filas, no los elementos.
Tenés las temperaturas de la semana en grados Celsius y las querés en Fahrenheit. ¿Cuál es la diferencia entre hacerlo con lista y con array?
La fórmula es F = C × 9/5 + 32.
Con lista, hace falta un ciclo:
fahrenheit = []
for c in celsius:
fahrenheit.append(c * 9/5 + 32)
Con array, es una línea:
celsius = np.array([20, 25, 18])
fahrenheit = celsius * 9/5 + 32
Las dos dan [68, 77, 64.4].
celsius * 9/5 multiplica cada
temperatura, y + 32 le suma 32 a cada resultado. Si celsius
fuera una lista común, esa misma línea daría cualquier cosa: lista * 9 repetiría la
lista nueve veces y después /5 tiraría TypeError.
Cuándo usar cada una. Para pocos datos y cosas variadas, lista. Para muchos números sobre los que hacés cuentas, array. La unidad 6 entera va en esa dirección: herramientas para cuando los datos son muchos.
Control: 20 °C tienen que dar 68 °F, que es el dato que todos conocen. Si te da otra cosa, revisá el orden de las operaciones.
Con las notas de un curso, calcular el promedio, el desvío estándar, cuántas están aprobadas y las notas llevadas a escala 0-100. Hacerlo con NumPy y comparar con la versión que usa listas.
Los datos y la diferencia entre las dos estructuras:
lista = [4, 7, 9, 2, 8] # lista comun
notas = np.array([4, 7, 9, 2, 8]) # array de NumPy
La diferencia no es de sintaxis: es de qué significa una operación. Con un array, las operaciones se aplican a todos los elementos a la vez; con una lista, hay que escribir el recorrido.
El promedio:
sum(lista) / len(lista) # 6.0, con listas
Cuántas están aprobadas, que es donde más se nota:
cantidad = 0 # con listas, un ciclo
for n in lista:
if n >= 7:
cantidad = cantidad + 1
notas >= 7 no devuelve True o False: devuelve un array de booleanos, uno por nota, [False, True, True, False, True]. Y como en Python True vale 1, sumarlo cuenta cuántos hay. Ese patrón —comparar y después sumar— resuelve casi todos los "cuántos cumplen".
El escalado a 0-100:
[x * 10 for x in lista] # [40, 70, 90, 20, 80]
El desvío estándar, que con listas habría que escribir a mano:
El control a mano del desvío, para no depender de la biblioteca:
desvíos: -2, 1, 3, -4, 2
cuadrados: 4, 1, 9, 16, 4 → suma 34
34 / 5 = 6.8 → √6.8 = 2.6077 ✓
Un detalle que aparece en los parciales: np.std() divide por n (desvío poblacional). Si el enunciado pide el muestral, que divide por n−1, hay que pedirlo: notas.std(ddof=1), que da 2.9155. Los dos son "el desvío estándar" y hay que saber cuál se está calculando.
Cuándo conviene cada una:
array: muchos datos, todos del mismo tipo, cuentas sobre todos
Un array no se puede agrandar como una lista con append: tiene un tamaño fijo desde que se crea. A cambio, guarda los números uno al lado del otro en memoria y las operaciones son mucho más rápidas — con un millón de notas, la diferencia es de segundos a milisegundos.
El resumen de lo que devuelve cada cosa:
desvío = 2.6077
aprobadas = 3
escaladas = [40, 70, 90, 20, 80]
máximo = 9
Dónde se pierde el punto: escribir lista * 10 esperando que multiplique. Con una lista, * repite: [4, 7] * 2 da [4, 7, 4, 7]. Con un array multiplica cada elemento. Es el mismo símbolo y hace dos cosas distintas.
Dónde se cae la mayoría
- Esperar que lista * 2 duplique los valores. Repite la lista; sólo un array multiplica elemento a elemento.
- Olvidar el import, o escribir numpy.array cuando se importó como np.
- Sumar dos listas creyendo que suma posición a posición. Las concatena.
Hasta acá la explicación. La práctica es la otra mitad: 7 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Además trae una animación que muestra la idea en movimiento.
Practicar Bibliotecas y NumPy →Dónde entra este tema en el parcial
- Segundo parcial — Un array armado a mano10 puntos · resuelto paso a paso
- Segundo parcial — Encontrar y explicar los errores30 puntos · resuelto paso a paso
Los otros temas de la unidad 6
Bibliotecas de Python