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: 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
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.
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°.
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.
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 θ.
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.
plt.axis("equal")Derselbe Maßstab auf beiden Achsen, damit die Blüte rund herauskommt und nicht gestaucht.
Probier es selbst
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.
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.
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
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.