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에서 실행할 수 있어요. 노트북은 영어로 되어 있어요.
한 줄씩
n = np.arange(1, 1001)1부터 1000까지의 수를 담은 배열로, 씨앗 하나에 수 하나예요. np.arange는 끝값 바로 앞에서 멈추므로 1001을 주면 1000까지 나와요.
golden = np.pi * (3 - np.sqrt(5))라디안으로 나타낸 황금각이에요. 라디안은 numpy의 삼각함수가 쓰는 단위로, 한 바퀴가 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의 각도 단위로, 한 바퀴가 2π예요. np.radians(144)는 도에서 변환해요.
극좌표에서 x, y로
x = r·cos θ, y = r·sin θ.
plt.scatter(x, y, c=values)
점마다 점 하나. c는 컬러맵 cmap을 거쳐 값에 따라 각 점에 색을 칠해요.