Einstieg · Goldener Winkel

Lektion 1: Arrays und Winkel

Baue das Muster „Goldener Winkel“ in Python und lerne dabei:

  • numpy-Arrays mit np.arange
  • Rechnen mit einem ganzen Array auf einmal
  • Bogenmaß, np.cos und np.sin
  • von Winkel und Abstand zu x und y
  • ein Streudiagramm, nach einem Wert eingefärbt

Erst ansehen

Läuft nach einem Klick von YouTube.

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)

Kein Python auf diesem Computer? Das Notebook führt dasselbe Skript, die Übungen und die Lösungen in deinem Browser aus, in Google Colab. Das Notebook ist auf Englisch.

Zeile für Zeile

  1. n = np.arange(1, 1001)

    Ein Array der Zahlen 1 bis 1000, eine pro Samen. np.arange hört kurz vor seinem Ende auf, also ergibt 1001 die 1000.

  2. golden = np.pi * (3 - np.sqrt(5))

    Der goldene Winkel im Bogenmaß, der Einheit, die die Trigonometrie von numpy verwendet: Eine volle Drehung ist 2π. π·(3 − √5) ≈ 2,39996 Radiant, also 137,5°.

  3. theta, r = n * golden, np.sqrt(n)

    Rechnen mit einem Array wirkt auf jedes Element: n * golden sind 1000 Winkel auf einmal, np.sqrt(n) 1000 Abstände. Eine Schleife ist nicht nötig.

  4. x, y = r * np.cos(theta), r * np.sin(theta)

    Von Winkel und Abstand (Polarkoordinaten) zu einem Punkt auf dem Blatt: x = r·cos θ, y = r·sin θ.

  5. plt.scatter(x, y, s=8, c=n, cmap="viridis")

    Ein Punkt pro Samen, Größe 8, jeder nach seiner Nummer n aus der Farbskala „viridis“ eingefärbt.

  6. plt.axis("equal")

    Derselbe Maßstab auf beiden Achsen, damit die Blüte rund herauskommt und nicht gestaucht.

Probier es selbst

  1. Gib den goldenen Winkel in Grad aus.

    Hinweis

    np.degrees rechnet Bogenmaß in Grad um.

    Lösung

    print(np.degrees(golden)) gibt 137.50776405003785 aus.

  2. Zeichne nur die ersten 100 Samen.

    Hinweis

    Ändere das Ende von np.arange.

    Lösung

    n = np.arange(1, 101). Mit nur 100 Samen sind die Spiralfamilien viel schwerer zu sehen: Das Muster braucht viele Samen.

  3. Mach die äußeren Samen größer als die inneren.

    Hinweis

    s, die Größe, kann auch ein Array sein.

    Lösung

    plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"): Samen 1000 bekommt Größe 20, Samen 50 Größe 1.

Quiz

1. Was enthält np.arange(1, 1001)?
2. Warum gibt es im Skript keine for-Schleife?
3. In welcher Einheit nehmen np.cos und np.sin Winkel an?
4. Was macht aus einem Winkel θ und einem Abstand r einen Punkt?
5. Was bekommst du mit golden = np.radians(144)?

Lernkarten

Lies die Vorderseite, sag dir die Rückseite vor, dann öffne die Karte.

  • np.arange(a, b)

    Die Zahlen von a bis ausschließlich b, als numpy-Array.

  • Vektorisierter Code

    Rechnen mit ganzen Arrays auf einmal statt einer Schleife über die Elemente: kürzer und schneller.

  • Bogenmaß

    Die Winkeleinheit von np.cos und np.sin: 2π für eine volle Drehung. np.radians(144) rechnet aus Grad um.

  • Polar zu x, y

    x = r·cos θ, y = r·sin θ.

  • plt.scatter(x, y, c=values)

    Ein Punkt pro Datenpunkt; c färbt jeden nach einem Wert über die Farbskala cmap ein.

Diese Lernkarten auf einer eigenen Seite →