レッスン1:配列と角度
Pythonで 「黄金角」 を作りながら、次のことを学びます:
- np.arange でつくる numpy の配列
- 配列全体にまとめて計算する
- ラジアン、np.cos と np.sin
- 角度と距離から x と y へ
- 値で色をつける散布図
まず見てみる
クリックすると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)
このコンピューターにPythonが入っていませんか?ノートブックなら、同じスクリプト、練習問題、答えを、ブラウザ上のGoogle Colabで実行できます。ノートブックは英語です。
1行ずつ
n = np.arange(1, 1001)種ひとつにつき1つ、1から1000までの数の配列です。np.arange は終わりの値の直前で止まるので、1001と書くと1000までになります。
golden = np.pi * (3 - np.sqrt(5))ラジアンで表した黄金角です。ラジアンは numpy の三角関数が使う単位で、1回転は2πです。π·(3 − √5) ≈ 2.39996ラジアンで、これは137.5°です。
theta, r = n * golden, np.sqrt(n)配列への計算は、すべての要素に働きます。n * golden で1000個の角度が、np.sqrt(n) で1000個の距離がまとめてできます。ループはいりません。
x, y = r * np.cos(theta), r * np.sin(theta)角度と距離(極座標)から、紙の上の点へ:x = r·cos θ、y = r·sin θ。
plt.scatter(x, y, s=8, c=n, cmap="viridis")種ひとつにつき点をひとつ、大きさ8で打ち、それぞれ番号nに応じて「viridis」カラーマップの色をつけます。
plt.axis("equal")両方の軸を同じ縮尺にするので、花はつぶれずに丸く描かれます。
やってみよう
黄金角を度で表示してみましょう。
ヒント
np.degrees はラジアンを度に変えます。
答え
print(np.degrees(golden)) は 137.50776405003785 と表示します。
最初の100個の種だけを描いてみましょう。
ヒント
np.arange の終わりの値を変えます。
答え
n = np.arange(1, 101)。種が100個だけだと、らせんの一族はずっと見えにくくなります。このパターンには、たくさんの種が必要なのです。
外側の種を、内側の種より大きくしてみましょう。
ヒント
大きさ s も配列にできます。
答え
plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"):種1000の大きさは20、種50の大きさは1になります。
クイズ
フラッシュカード
表を読み、裏に何があるかを自分で言ってみてから、カードを開いてください。
np.arange(a, b)
aからbまで、ただしbは含まない数を並べた numpy の配列。
ベクトル化されたコード
要素ごとのループの代わりに、配列全体にまとめて計算すること。短くて速い。
ラジアン
np.cos と np.sin の角度の単位。1回転で2π。np.radians(144) で度から換算します。
極座標から x, y へ
x = r·cos θ、y = r·sin θ。
plt.scatter(x, y, c=values)
点ごとにドットをひとつ。c は、カラーマップ cmap を通して、それぞれを値で色分けします。