初級 · 黄金角

レッスン1:配列と角度

Pythonで 「黄金角」 を作りながら、次のことを学びます:

  • np.arange でつくる numpy の配列
  • 配列全体にまとめて計算する
  • ラジアン、np.cos と np.sin
  • 角度と距離から x と y へ
  • 値で色をつける散布図

まず見てみる

クリックすると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)

このコンピューターにPythonが入っていませんか?ノートブックなら、同じスクリプト、練習問題、答えを、ブラウザ上のGoogle Colabで実行できます。ノートブックは英語です。

1行ずつ

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

    種ひとつにつき1つ、1から1000までの数の配列です。np.arange は終わりの値の直前で止まるので、1001と書くと1000までになります。

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

    ラジアンで表した黄金角です。ラジアンは numpy の三角関数が使う単位で、1回転は2πです。π·(3 − √5) ≈ 2.39996ラジアンで、これは137.5°です。

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

    配列への計算は、すべての要素に働きます。n * golden で1000個の角度が、np.sqrt(n) で1000個の距離がまとめてできます。ループはいりません。

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

    角度と距離(極座標)から、紙の上の点へ:x = r·cos θ、y = r·sin θ。

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

    種ひとつにつき点をひとつ、大きさ8で打ち、それぞれ番号nに応じて「viridis」カラーマップの色をつけます。

  6. plt.axis("equal")

    両方の軸を同じ縮尺にするので、花はつぶれずに丸く描かれます。

やってみよう

  1. 黄金角を度で表示してみましょう。

    ヒント

    np.degrees はラジアンを度に変えます。

    答え

    print(np.degrees(golden)) は 137.50776405003785 と表示します。

  2. 最初の100個の種だけを描いてみましょう。

    ヒント

    np.arange の終わりの値を変えます。

    答え

    n = np.arange(1, 101)。種が100個だけだと、らせんの一族はずっと見えにくくなります。このパターンには、たくさんの種が必要なのです。

  3. 外側の種を、内側の種より大きくしてみましょう。

    ヒント

    大きさ s も配列にできます。

    答え

    plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"):種1000の大きさは20、種50の大きさは1になります。

クイズ

1. np.arange(1, 1001) には何が入っていますか?
2. スクリプトに for ループがないのはなぜですか?
3. np.cos と np.sin は、どの単位で角度を受け取りますか?
4. 角度θと距離rを点に変えるのはどれですか?
5. golden = np.radians(144) にすると、どうなりますか?

フラッシュカード

表を読み、裏に何があるかを自分で言ってみてから、カードを開いてください。

  • 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 を通して、それぞれを値で色分けします。

このフラッシュカードを別のページで →