Lección 1: Arrays y ángulos
Construye en Python el patrón «Ángulo áureo» y aprende por el camino:
- arrays de numpy con np.arange
- operaciones sobre todo un array a la vez
- radianes, np.cos y np.sin
- de un ángulo y una distancia a x e y
- un gráfico de dispersión coloreado según un valor
Míralo primero
Se reproduce desde YouTube tras hacer clic.
"""Golden angle: seed n at the angle n x 137.5 degrees and the distance sqrt(n) (Vogel, 1979).
Run: python golden-angle.py (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("dark_background")
n = np.arange(1, 1001) # seed numbers
golden = np.pi * (3 - np.sqrt(5)) # 137.5 degrees in radians: 360 / phi**2
theta, r = n * golden, np.sqrt(n) # the whole rule
x, y = r * np.cos(theta), r * np.sin(theta)
plt.figure(figsize=(6, 6))
plt.scatter(x, y, s=8, c=n, cmap="viridis")
plt.axis("equal")
plt.axis("off")
plt.show()
# Try: golden = np.radians(144) -> five straight spokes (144 degrees is 2/5 of a turn)
¿No tienes Python en este equipo? El cuaderno ejecuta el mismo script, los ejercicios y las respuestas en tu navegador, en Google Colab. El cuaderno está en inglés.
Línea a línea
n = np.arange(1, 1001)Un array con los números del 1 al 1000, uno por semilla. np.arange se detiene justo antes de su final, así que 1001 da 1000.
golden = np.pi * (3 - np.sqrt(5))El ángulo áureo en radianes, la unidad que usa la trigonometría de numpy: una vuelta completa es 2π. π·(3 − √5) ≈ 2,39996 radianes, es decir, 137,5°.
theta, r = n * golden, np.sqrt(n)Una operación sobre un array actúa sobre cada elemento: n * golden son 1000 ángulos a la vez, np.sqrt(n) 1000 distancias. No hace falta ningún bucle.
x, y = r * np.cos(theta), r * np.sin(theta)De un ángulo y una distancia (coordenadas polares) a un punto en la página: x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, s=8, c=n, cmap="viridis")Un punto por semilla, de tamaño 8, cada uno coloreado con el mapa de colores «viridis» según su número n.
plt.axis("equal")La misma escala en los dos ejes, para que la flor salga redonda y no aplastada.
Pruébalo tú
Muestra el ángulo áureo en grados.
Pista
np.degrees convierte radianes en grados.
Respuesta
print(np.degrees(golden)) muestra 137.50776405003785.
Dibuja solo las 100 primeras semillas.
Pista
Cambia el final de np.arange.
Respuesta
n = np.arange(1, 101). Con solo 100 semillas, las familias de espirales se ven mucho peor: el patrón necesita muchas semillas.
Haz que las semillas de fuera sean más grandes que las de dentro.
Pista
s, el tamaño, también puede ser un array.
Respuesta
plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"): la semilla 1000 recibe el tamaño 20 y la semilla 50 el tamaño 1.
Cuestionario
Tarjetas de repaso
Lee el anverso, di el reverso para ti y luego abre la tarjeta.
np.arange(a, b)
Los números desde a hasta b, sin incluir b, como un array de numpy.
Código vectorizado
Operaciones sobre arrays enteros a la vez en lugar de un bucle elemento a elemento: más corto y más rápido.
Radianes
La unidad de ángulo de np.cos y np.sin: 2π para una vuelta completa. np.radians(144) convierte desde grados.
De polares a x, y
x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, c=values)
Un punto por cada dato; c colorea cada uno según un valor a través del mapa de colores cmap.