06. 여섯 번째 수업: 파이썬 넘파이(NumPy) 우주선 가속도 시뮬레이터

우주 전투기 10만 대가 교전을 벌이는 대규모 스타크래프트 엔진 맵을 만들고 있습니다. 파이썬 기본 리스트([]) 껍데기를 이용해서 각 전투기의 상태 리스트 $v_1 = [3, 4]$ 랑, 그 우주선에 처맞는 똥바람 강풍 속도 타격 리스트 $v_2 = [1, 5]$ 데이터를 더치페이 방식으로 합쳐버리는(벡터 덧셈) for 문 루프를 $10$만 번 코딩해 봅니다.

결과는? list + list 의 미친 버그 때문에 파이썬은 이 두 가지를 요소 스칼라 단위로 합치지 않고 멍청하게 리스트 창고 방 개수 길이를 이어 붙여 연장해 버립니다! ($ [3, 4, 1, 5] $) 우주선을 물리 엔진 합력으로 움직이려면 기본 파이썬 엔진을 던져버리고, 구글, 나사(NASA), 알파고의 기하학 우주 무기인 NumPy(넘파이)import 로 꽂아 넣어야 합니다!

넘파이 엔진으로 제어되는 거대한 우주선 벡터 함대


1. NumPy 배터리 장착! 배열(Array) 은 신이다

넘파이는 데이터를 다루는 1차원 ndarray 를 마치 살아 숨 쉬는 수학 공식 벡터 객체 그 자체로 인식하도록 렌더링된 사기적인 라이브러리 모듈입니다.

우주선 A가 [동쪽으로 5, 북쪽으로 2] 만큼 속력을 내서 전진하고 있는데, 등 뒤에서 [동쪽으로 2, 북쪽으로 7] 이라는 미친 슈퍼 강풍 토네이도가 불어와 때려 박혔을 때 최종 합력 궤적을 NumPy 스크립트로 터트려 봅시다!

# [Python Code] 우주선 레이더: NumPy 물리 엔진 가속 덧셈 시뮬레이터
import numpy as np

# 1. 우주선의 자체 엔진 추진력 벡터 v_a (크기, 방향 컴포넌트 세팅)
# 리스트 껍데기 [] 를 np.array 엔진으로 감싸 팩토리얼 캡슐링을 건다!
v_a = np.array([5, 2])
print(f"[엔진 출력 센서] 내 우주선의 추력: {v_a}")

# 2. 등짝을 때리는 외부 토네이도 돌풍의 강제 이동 벡터 v_b
v_b = np.array([2, 7])
print(f"[기상청 레이더] 몰아치는 토네이도 풍속: {v_b}")

# =======================================================
# 3. 우주의 꼬리물기 덧셈 해킹 (두 화살표의 융합 엔진 점화!)
# 파이썬 기본 리스트 였다면 [5, 2, 2, 7] 이라는 쓰레기 리스트 병합이 떴겠지만,
# 넘파이는 알아서 x는 x끼리, y는 y끼리 벡터 매크로 덧셈 교차 연산을 갈겨줍니다.
v_result = v_a + v_b
print("-" * 50)
print(f"★ [물리엔진 합력 도출] 우주선의 최종 강제 이동 궤적 타겟: {v_result}")

# 번외: 만약 내가 엔진 풀악셀을 부스터로 3배(스칼라 뻥튀기) 로 터뜨렸다면?
v_boost = 3 * v_a
print(f"-> [부스터 엔진] 3배 스칼라 곱 파워업 팽창 궤적:   {v_boost}")

2. 렌더링 콘솔 도출 창! 피타고라스 엔진 파워값 해킹

[엔진 출력 센서] 내 우주선의 추력: [5 2]
[기상청 레이더] 몰아치는 토네이도 풍속: [2 7]
--------------------------------------------------
★ [물리엔진 합력 도출] 우주선의 최종 강제 이동 궤적 타겟: [7 9] ★
-> [부스터 엔진] 3배 스칼라 곱 파워업 팽창 궤적:   [15  6]

정확하게 X좌표 엑셀 값인 $5+2=7$ 과 Y좌표 $2+7=9$ 가 융합되어 최종 대각선 벡터 화살표 $\mathbf{[7, 9]}$ 목적지가 모니터 좌표에 1밀리초 만에 타겟팅 찍혔습니다. 스칼라 곱셈 역주행 부스터인 $[15, 6]$ 오버클럭 렌더링도 피투성이가 되는 렉 없이 순식간에 떨어집니다!

그런데, 레이더에 뜬 최종 좌표 [7, 9] 궤적 화살표가 그리는 “우주선의 진짜 순수 엔진 가속 길이 파워 스피드값 (벡터의 덩치 크기 Magnitude)” 은 피타고라스 스크립트로 어떻게 부숴서 도출해 낼 수 있을까요?

넘파이 수학 계산 모듈 안에 잠들어 있는 최강의 피타고라스 정리 스캐너인 영문 라이브러리 np.linalg.norm() 이라는 마법 함수로 그냥 감싸버리면 됩니다. (선형대수학 Linear Algebra 노름 Norm 값 길이 추출 함수라는 뜻입니다.)

# [Python Code] 결과 벡터의 가성비 엔진 파워(대각선 길이 Magnitude) 역추적 파싱
# (루트 x제곱 + y제곱 을 자동 연산)
final_speed = np.linalg.norm(v_result)

print(f"==== 내비게이션 좌표 [7, 9] 를 향해 뚫고 날아가는 우주선의 진짜 빗변 스피드 출력: {final_speed:.2f} 단위 ====")
==== 내비게이션 좌표 [7, 9] 를 향해 뚫고 날아가는 우주선의 진짜 빗변 스피드 출력: 11.40 단위 ====

끝났습니다. AI 알파고가 왜 바둑판을 벡터 공간 텐서(Tensor) 조각들 뭉텅이 데이터로 치환해서 융단 폭격을 던져 넣는가! 화살표라는 공간 방향성 부피 데이터가 숫자 $엑셀$ 배열 데이터 하나만으로 완전 무결하게 해부되어 메모리에 컴파일되기 때문입니다.

우리가 만약 3D 게임 그래픽 포털을 뚫는 코드를 배양하고 싶다면, 저 배열 $[7, 9]$ 뒤에 컴마(,) 와 Z축 뎁스 데이터 값인 높이 숫자 파라미터 덩어리 하나만 더 욱여넣어서 $[7, 9, 15]$ 로 던져주면 끝납니다. 넘파이 모듈 스크립트는 3D든 10D 차원이든 코피 흘리지 않고 미친 듯이 똑같은 속도로 합력과 크기 파워를 무차별 폭격으로 스캔 후 계산해 냅니다.

좌표 평면을 찢고 우주를 향해 나아가는 벡터(Vector) 파트의 물리 엔진 기초 튜토리얼은 여기까지입니다. 이 훌륭하고 강력한 화살표 막대기들의 꼭대기 언덕 등성이에 올라타서, 그곳에서 곡선의 경사 미끄럼틀을 타고 내려오는 가장 악랄한 미끄럼 방지 해킹 알고리즘. 드디어 미분(Derivative) 튜토리얼 파트로 넘어가겠습니다. 수고하셨습니다.

서브목차