선형대수 책을 펼치면 첫 장부터 "벡터 공간", "체(field) 위의 가군" 같은 말이 쏟아집니다. 거기서 책을 덮었다면, 이 강의는 바로 그 자리에서 시작합니다.
사실 개발자는 선형대수가 다루는 대상을 이미 매일 만지고 있습니다. 화면 위 마우스 위치 (320, 180), 색 (255, 128, 0), 장바구니에 담긴 물건 개수, 검색 엔진이 문장을 바꿔 놓은 숫자 768개짜리 목록까지 모두 숫자를 정해진 순서로 묶은 것입니다. 선형대수는 이런 숫자 묶음을 더하고, 늘이고, 돌리고, 비교하는 규칙을 정리한 학문입니다.
이번 교시에는 계산을 거의 하지 않습니다. 숫자 묶음을 그림으로 보는 법, 책의 기호를 읽는 법, 그리고 같은 것을 NumPy 배열로 만드는 법을 익힙니다.
순서가 정해진 숫자 묶음을 벡터(vector) 라고 부릅니다. 묶음에 든 숫자 하나하나는 성분(component) 이고, 성분의 개수를 그 벡터의 차원(dimension) 이라고 합니다.
| 무엇을 적었나 | 숫자 묶음 | 차원 |
|---|---|---|
| 화면 위의 점 | (320, 180) | 2 |
| 색 (빨강, 초록, 파랑) | (255, 128, 0) | 3 |
| 장바구니 (사과, 우유, 빵) | (3, 1, 2) | 3 |
| 가로세로 28칸 흑백 사진 | 칸마다 밝기 하나씩 | 784 |
여기서 가장 중요한 단어는 순서입니다. 장바구니 (3, 1, 2)는 "사과 3개, 우유 1개, 빵 2개"라는 약속이 있어야 뜻이 생깁니다. 같은 숫자라도 (1, 3, 2)는 전혀 다른 장바구니입니다. 벡터를 다룰 때는 늘 "몇 번째 칸이 무엇을 뜻하는가"를 먼저 정해 둡니다.
차원이 784라고 겁먹을 필요는 없습니다. 784차원 벡터는 그림으로 그릴 수 없지만, 숫자 784개를 정해진 순서로 적은 목록일 뿐입니다. 이 강의는 그림으로 그릴 수 있는 2차원에서 직관을 잡고, 같은 규칙을 NumPy로 몇 차원에든 그대로 적용하는 방식으로 진행합니다.
2차원 벡터는 평면 위의 점 하나로 그릴 수 있습니다. 첫째 숫자는 원점에서 오른쪽으로 몇 칸(x), 둘째 숫자는 위로 몇 칸(y)입니다. 음수면 반대로, 왼쪽이나 아래로 갑니다.
아래 실습대에서 검은 점 P를 끌어 보세요. 청록 막대가 x, 진홍 막대가 y입니다. 점을 왼쪽 아래로 끌면 두 숫자가 모두 음수가 되는 것도 확인해 보세요.
책에서는 숫자를 세로로 세워 씁니다
x: 오른쪽으로 몇 칸
y: 위로 몇 칸
가로로 쓰면: (3, 2)
NumPy로 확인하기
실습대에서 값을 정할 때마다, 서버의 NumPy가 같은 숫자로 계산한 결과입니다.
>>> import numpy as np
>>> p = np.array([3, 2])
>>> p
array([3, 2])
>>> p.shape
(2,)
>>> p.dtype
dtype('int64')
>>> p[0]
np.int64(3)
>>> p[1]
np.int64(2)실습대 오른쪽에는 같은 점이 숫자 두 개를 세로로 세운 모양으로 나옵니다. 책에서 벡터를 적는 기본 모양이 이것입니다. 가로로 (3, 2)라고 쓰는 것과 뜻은 같습니다. 세로로 쓰는 이유는 5교시에서 행렬을 곱할 때 드러납니다.
점을 끌어 (3, 2)와 (2, 3)을 번갈아 만들어 보면, 같은 숫자 두 개라도 순서가 바뀌면 전혀 다른 곳임을 눈으로 확인할 수 있습니다.
선형대수 책이 어렵게 느껴지는 큰 이유 하나는 기호입니다. 기호는 긴 말을 줄여 쓴 것일 뿐이니, 소리 내어 읽는 법부터 익혀 두면 훨씬 덜 낯섭니다.
| 책에 적힌 모양 | 읽는 법 | 뜻 | 파이썬에서는 |
|---|---|---|---|
| (굵은 글씨) | 벡터 v | 숫자 묶음 하나에 붙인 이름 | v = np.array([3, 2]) |
| (화살표) | 벡터 v | 위와 같은 뜻. 손으로 쓸 때 주로 씀 | 위와 같음 |
| v 일, v 이 | v의 첫째, 둘째 성분 | v[0], v[1] | |
| 알, 실수 전체 | 소수까지 포함한 모든 수 | float | |
| 알 투 | 실수 두 개짜리 벡터 전체 = 평면 | shape이 (2,)인 배열 | |
| v는 알 쓰리에 속한다 | v는 실수 세 개짜리 벡터다 | v.shape == (3,) |
세로 벡터는 이렇게 씁니다.
한 가지 주의할 점이 있습니다. 책은 1부터 세고, 파이썬은 0부터 셉니다. 책의 은 파이썬의 p[0]입니다. 이 차이 때문에 생기는 실수가 아주 흔하니, 처음부터 의식해 두세요.
파이썬 리스트로도 숫자를 묶을 수 있지만, 선형대수 계산에는 NumPy를 씁니다. NumPy 배열은 같은 종류의 숫자만 담는 대신 계산이 빠르고, 다음 교시부터 볼 벡터 연산을 그대로 지원합니다.
설치는 한 줄입니다. 이 강의의 출력은 모두 NumPy 2.x 기준입니다.
pip install numpy # 또는 uv add numpyNumPy는 관례로 np라는 짧은 이름으로 불러옵니다. 배열은 np.array에 리스트를 넘겨 만듭니다.
>>> import numpy as np
>>> p = np.array([3, 2])
>>> p
array([3, 2])배열을 다룰 때 가장 먼저 확인하는 두 가지가 shape과 dtype입니다. shape은 "어떤 모양으로 숫자가 몇 개 있는가", dtype은 "어떤 종류의 숫자인가"입니다.
>>> p.shape
(2,)
>>> p.dtype
dtype('int64')
>>> p.ndim
1
>>> len(p)
2(2,)는 "한 줄에 숫자 2개"라는 뜻입니다. 쉼표가 붙은 이유는 파이썬에서 원소가 하나인 튜플을 (2,)로 쓰기 때문입니다. ndim은 축의 개수입니다. 숫자가 한 줄로 늘어선 벡터는 축이 하나라 1입니다.
정수만 넣으면 int64, 소수가 하나라도 섞이면 배열 전체가 float64가 됩니다. 실습대에서 점을 3.5로 옮겼을 때 dtype이 바뀐 것이 이것입니다.
>>> q = np.array([3.5, 2])
>>> q
array([3.5, 2. ])
>>> q.dtype
dtype('float64')2.는 2.0을 줄여 쓴 것입니다. 배열 안의 숫자는 모두 같은 종류여야 해서 정수 2도 실수 2.0으로 바뀌었습니다.
성분은 대괄호로 꺼냅니다. 0부터 세고, 음수는 뒤에서부터 셉니다.
>>> color = np.array([255, 128, 0])
>>> color[0]
np.int64(255)
>>> color[-1]
np.int64(0)
>>> color[0:2]
array([255, 128])np.int64(255)는 "NumPy의 64비트 정수 255"라는 뜻입니다. 계산에는 보통 정수 255와 똑같이 쓸 수 있습니다. color[0:2]처럼 범위를 주면 0번부터 2번 앞까지, 즉 성분 두 개를 담은 새 배열이 나옵니다.
784차원도 만드는 방법은 같습니다. 그림으로는 못 그려도 shape은 그대로 알려 줍니다.
>>> photo = np.zeros(784)
>>> photo.shape
(784,)
>>> photo[:5]
array([0., 0., 0., 0., 0.])숫자를 리스트로 묶지 않고 넘기기. np.array의 첫 인자는 숫자 묶음 하나입니다. 숫자를 따로따로 넘기면 둘째 숫자를 "숫자 종류(dtype)"로 읽으려다 실패합니다.
>>> np.array(3, 2)
Traceback (most recent call last):
...
TypeError: Cannot interpret '2' as a data type1부터 세기. 책의 $p_2$를 꺼내려고 p[2]를 쓰면, 성분이 둘뿐인 벡터에서는 범위를 벗어납니다.
>>> p = np.array([3, 2])
>>> p[2]
Traceback (most recent call last):
...
IndexError: index 2 is out of bounds for axis 0 with size 2a로 만들고, a.shape과 a.dtype이 무엇일지 먼저 예상한 뒤 확인해 보세요.(255, 128, 0)은 몇 차원 벡터인가요? 책의 기호로는 어떤 집합에 속한다고 쓸까요?v = np.array([4, 7, 1, 9])에서 마지막 성분과, 앞의 세 성분을 꺼내 보세요.>>> a = np.array([-2, 1.5])
>>> a.shape
(2,)
>>> a.dtype
dtype('float64')
>>> v = np.array([4, 7, 1, 9])
>>> v[-1]
np.int64(9)
>>> v[:3]
array([4, 7, 1])2번은 숫자가 세 개이니 3차원 벡터이고, 책에서는 실수 세 개짜리 벡터의 집합에 속한다는 뜻으로 ℝ³에 속한다고 씁니다.
이번 교시 정리
벡터는 순서가 정해진 숫자 묶음이다. 숫자 하나하나는 성분, 개수는 차원.
2차원 벡터는 평면 위의 점: 첫째 숫자는 오른쪽으로, 둘째 숫자는 위로 몇 칸.
책의 굵은 글씨 v, 첨자 v₁, ℝ² 는 각각 벡터 이름, 성분, '실수 두 개짜리 벡터 전체'.
책은 1부터, 파이썬은 0부터 센다: v₁ = v[0].
np.array로 배열을 만들고 shape(모양)과 dtype(숫자 종류)부터 확인한다.
다음 교시에는 벡터를 화살표로 그리고, 두 벡터를 더하고 늘이는 법을 배웁니다. 파이썬 리스트의 +와 NumPy 배열의 +가 전혀 다른 일을 한다는 것도 그때 확인합니다.
새 교시·새 강의 소식 받기
이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.
R
ReflexKR
눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.
ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.
© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
질문과 답변
이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.