Principiante · Ángulo áureo

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.py
"""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

  1. 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.

  2. 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°.

  3. 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.

  4. 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 θ.

  5. 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.

  6. plt.axis("equal")

    La misma escala en los dos ejes, para que la flor salga redonda y no aplastada.

Pruébalo tú

  1. Muestra el ángulo áureo en grados.

    Pista

    np.degrees convierte radianes en grados.

    Respuesta

    print(np.degrees(golden)) muestra 137.50776405003785.

  2. 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.

  3. 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

1. ¿Qué contiene np.arange(1, 1001)?
2. ¿Por qué no hay ningún bucle for en el script?
3. ¿En qué unidad reciben los ángulos np.cos y np.sin?
4. ¿Qué convierte un ángulo θ y una distancia r en un punto?
5. ¿Qué obtienes con golden = np.radians(144)?

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.

Estas tarjetas en su propia página →