Skip to content

10주차 · NumPy를 위한 행렬과 벡터 기초

이번 주는 코딩 실습보다 수학적 배경 이해가 목표입니다. 이 장을 마치면 다음을 설명할 수 있어야 합니다.

  • 점, 벡터, 행렬을 구분한다.
  • 벡터 덧셈을 성분별 계산과 화살표 그림으로 설명한다.
  • 스칼라배가 벡터의 길이와 방향을 어떻게 바꾸는지 설명한다.
  • 행렬을 행(row), 열(column), 원소, 크기(m × n)로 읽는다.
  • 행렬 덧셈과 스칼라배가 같은 위치의 칸끼리 계산되는 이유를 설명한다.
  • 행렬-벡터 곱을 “행마다 하나의 가중합을 만드는 계산”으로 설명한다.
  • 행렬-행렬 곱이 가능한 조건과 결과 크기를 판단한다.
  • NumPy에서 shape, axis, *, @를 배울 때 어떤 수학 개념과 연결되는지 말한다.

왜 NumPy 전에 행렬과 벡터를 배우나요?

Section titled “왜 NumPy 전에 행렬과 벡터를 배우나요?”

Python 리스트에 숫자를 넣는 것만으로도 간단한 계산은 할 수 있습니다. 하지만 공학 데이터는 금방 다음처럼 커집니다.

데이터 상황수학적으로 보는 모양NumPy에서 만날 모양
전압값 하나스칼라3.3
전압을 5번 측정벡터shape == (5,)
3개 센서를 4번 측정행렬shape == (4, 3)
이미지 한 장여러 축을 가진 배열height × width × color

즉, NumPy는 단순히 “빠른 리스트”가 아닙니다. 벡터와 행렬의 계산 규칙을 코드로 옮긴 도구입니다.


처음 보는 용어가 많다면, 이번 주에는 아래 뜻으로 먼저 정리하세요.

용어쉬운 설명
스칼라(scalar)숫자 하나3, -1.5, 0.2
벡터(vector)숫자 성분을 가진 화살표 또는 이동량[2, 3]
성분(component)벡터 안의 각 숫자[2, 3]2, 3
행렬(matrix)행과 열을 가진 숫자표[[1, 2], [3, 4]]
행(row)가로줄첫 번째 행 [1, 2]
열(column)세로줄첫 번째 열 [1, 3]
원소행렬의 한 칸1행 2열의 값 2
shape데이터의 모양(2, 3)
axis어느 방향으로 모을지 나타내는 축axis=0, axis=1

1. 점과 벡터: 같은 숫자쌍도 다르게 읽을 수 있습니다

Section titled “1. 점과 벡터: 같은 숫자쌍도 다르게 읽을 수 있습니다”

좌표평면에서 (2, 3)은 보통 점의 위치를 뜻합니다. 하지만 벡터로 읽으면 뜻이 조금 달라집니다.

표현읽는 법
(2, 3)x=2, y=3인 위치
벡터 [2, 3]오른쪽으로 2, 위로 3 이동하는 화살표
v = [2, 3]
첫 번째 성분 2 → x 방향으로 2칸
두 번째 성분 3 → y 방향으로 3칸

벡터를 처음 배울 때는 “화살표”와 “숫자 묶음”을 번갈아 떠올리세요.

  • 그림으로 보면: 이동 화살표
  • 계산으로 보면: 같은 위치 성분끼리 계산하는 숫자 묶음

2. 벡터 덧셈: 두 번 움직이면 한 번의 움직임이 됩니다

Section titled “2. 벡터 덧셈: 두 번 움직이면 한 번의 움직임이 됩니다”

두 벡터를 더한다는 것은 두 이동을 이어 붙인다는 뜻입니다.

u = [2, 1]
v = [1, 3]
u + v = [2 + 1, 1 + 3]
= [3, 4]

성분별로 보면 x 방향 이동량끼리 더하고, y 방향 이동량끼리 더합니다.

인터랙티브 · 벡터 덧셈: 꼬리와 머리를 이어 보기 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

  • u = [2, 1]은 오른쪽으로 몇 칸, 위로 몇 칸 움직이나요?
  • v = [1, 3]u의 끝에 붙이면 마지막 도착점은 어디인가요?
  • u + vv + u의 결과 성분은 같은가요?

3. 스칼라배: 같은 방향으로 늘리거나 반대로 뒤집기

Section titled “3. 스칼라배: 같은 방향으로 늘리거나 반대로 뒤집기”

벡터 덧셈이 “이동을 이어 붙이는 계산”이었다면, 스칼라배는 “같은 이동을 몇 배로 키우거나 줄이는 계산”입니다.

스칼라는 방향이 없는 숫자입니다. 벡터에 스칼라를 곱하면 각 성분에 같은 숫자를 곱합니다.

v = [2, 1]
2v = [4, 2]
0.5v = [1, 0.5]
-v = [-2, -1]
스칼라 k벡터 kv의 변화
k > 1같은 방향으로 길어짐
0 < k < 1같은 방향으로 짧아짐
k = 0[0, 0]이 됨
k < 0반대 방향으로 뒤집힘
인터랙티브 · 스칼라배로 길이와 방향 바꾸기 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

  • 3[1, 2]의 결과는 무엇인가요?
  • -1[1, 2]는 원래 벡터와 같은 방향인가요, 반대 방향인가요?
  • 0[1, 2]는 어떤 벡터가 되나요?

4. 가중합과 내적: 같은 위치끼리 곱해 모두 더하기

Section titled “4. 가중합과 내적: 같은 위치끼리 곱해 모두 더하기”

이제 “성분별로 더하기”에서 한 단계 더 나아가, 성분마다 다른 중요도를 주는 계산을 보겠습니다.

행렬-벡터 곱을 배우기 전에 **가중합(weighted sum)**을 먼저 봅니다. 가중합은 “각 값에 중요도 또는 계수를 곱한 뒤 더하는 계산”입니다.

예를 들어 최종 점수를 이렇게 계산한다고 합시다.

최종점수 = 0.4 × 과제점수 + 0.6 × 시험점수

과제점수가 80점, 시험점수가 90점이면 다음과 같습니다.

0.4 × 80 + 0.6 × 90 = 32 + 54 = 86

벡터로 쓰면 이렇게 볼 수 있습니다.

가중치 w = [0.4, 0.6]
점수 x = [80, 90]
w · x = 0.4×80 + 0.6×90 = 86

여기서 ·는 내적(dot product) 기호입니다. 두 벡터의 성분 개수가 같을 때, 같은 위치끼리 곱한 뒤 모두 더하는 계산으로 이해하면 됩니다.


5. 행렬: 숫자가 들어 있는 직사각형 표

Section titled “5. 행렬: 숫자가 들어 있는 직사각형 표”

행렬은 행과 열을 가진 숫자표입니다.

A = [ 1 2 3 ]
[ 4 5 6 ]

이 행렬은 가로줄이 2개, 세로줄이 3개이므로 2 × 3 행렬입니다.

항목의미위 행렬에서 예
행(row)가로줄1행: [1, 2, 3]
열(column)세로줄2열: [2, 5]
원소행렬의 한 칸2행 3열의 값: 6
크기행 개수 × 열 개수2 × 3
인터랙티브 · 행렬의 행, 열, shape 읽기 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

수학 교과서에서는 보통 첫 번째 행, 첫 번째 열을 a11처럼 1부터 셉니다. NumPy는 Python 규칙을 따르므로 0부터 셉니다.

사람이 읽는 위치수학식 표현NumPy 표현
1행 1열a11A[0, 0]
1행 2열a12A[0, 1]
2행 3열a23A[1, 2]

6. 행렬 덧셈과 스칼라배: 같은 위치끼리 계산합니다

Section titled “6. 행렬 덧셈과 스칼라배: 같은 위치끼리 계산합니다”

행렬 덧셈은 두 행렬의 같은 위치에 있는 값을 더합니다.

[ 1 2 ] + [ 10 20 ] = [ 11 22 ]
[ 3 4 ] [ 30 40 ] [ 33 44 ]

중요한 조건이 있습니다. 두 행렬의 크기가 같아야 합니다.

  • 2 × 22 × 2는 더할 수 있습니다.
  • 2 × 33 × 2는 더할 수 없습니다.
인터랙티브 · 행렬 덧셈 칸별 하이라이트 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

행렬 덧셈은 같은 위치의 칸끼리 더합니다. 두 행렬의 모양이 다르면 덧셈은 정의되지 않습니다.

스칼라배도 비슷합니다. 행렬의 모든 칸에 같은 숫자를 곱합니다.

3 [ 1 2 ] = [ 3 6 ]
[ 3 4 ] [ 9 12 ]
  • 2 × 3 행렬과 2 × 3 행렬은 더할 수 있나요?
  • 2 × 3 행렬과 3 × 2 행렬은 더할 수 있나요?
  • 행렬에 3을 곱하면 몇 개의 칸이 바뀌나요?

7. 행렬-벡터 곱: 여러 개의 가중합을 한 번에 계산합니다

Section titled “7. 행렬-벡터 곱: 여러 개의 가중합을 한 번에 계산합니다”

앞에서 배운 내적을 행렬의 여러 행에 반복해서 적용하면 행렬-벡터 곱이 됩니다.

다음 행렬과 벡터를 봅시다.

A = [ 1 2 ] x = [ 10 ]
[ 3 4 ] [ 20 ]
[ 5 6 ]

A3 × 2 행렬이고, x2 × 1 벡터입니다. 앞 행렬의 열 수 2와 뒤 벡터의 행 수 2가 같으므로 곱할 수 있습니다.

Ax = [ 1×10 + 2×20 ] [ 50 ]
[ 3×10 + 4×20 ] = [ 110 ]
[ 5×10 + 6×20 ] [ 170 ]
인터랙티브 · 행렬-벡터 곱 한 행씩 계산하기 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

행렬-벡터 곱은 행렬의 각 행이 벡터와 만나 결과 숫자 하나씩을 만드는 계산입니다.

조금 더 깊게 보기: 열을 섞어서 결과 만들기

Section titled “조금 더 깊게 보기: 열을 섞어서 결과 만들기”

처음에는 “행마다 가중합” 관점만 확실히 잡아도 됩니다. 다음 관점은 행렬곱이 왜 벡터를 바꾸는 계산인지 이해할 때 도움이 됩니다.

행렬-벡터 곱은 두 가지 방식으로 볼 수 있습니다.

관점읽는 법초심자에게 좋은 이유
행마다 내적 계산각 행이 벡터와 만나 결과 하나를 만듦계산 절차가 분명함
열벡터의 선형결합벡터 성분만큼 행렬의 열들을 섞음변환 관점으로 연결됨

열벡터의 선형결합으로 보면 위 계산은 다음과 같습니다.

Ax = 10 [ 1 ] + 20 [ 2 ]
[ 3 ] [ 4 ]
[ 5 ] [ 6 ]

8. 행렬-행렬 곱: 행과 열이 만납니다

Section titled “8. 행렬-행렬 곱: 행과 열이 만납니다”

행렬-행렬 곱은 행렬 덧셈보다 조건이 더 까다롭습니다.

(m × n) @ (n × p) = (m × p)

핵심은 안쪽 크기입니다.

A: 2 × 3
B: 3 × 4
A @ B 가능 → 결과는 2 × 4

하지만 다음은 불가능합니다.

A: 2 × 3
B: 2 × 4
A @ B 불가능 → 안쪽 크기 3과 2가 다름
인터랙티브 · 행렬 크기와 계산 가능 여부 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

결과의 한 칸은 어떻게 만들어지나요?

Section titled “결과의 한 칸은 어떻게 만들어지나요?”

결과 행렬의 한 칸은 다음 두 줄이 만나서 만들어집니다.

  1. 앞 행렬의 한
  2. 뒤 행렬의 한
결과의 (i, j) 칸 = A의 i번째 행 · B의 j번째 열

예를 들어 A2 × 3, B3 × 2이면 결과는 2 × 2입니다.

A = [ 1 2 3 ] B = [ 10 20 ]
[ 4 5 6 ] [ 30 40 ]
[ 50 60 ]
AB의 1행 1열 = 1×10 + 2×30 + 3×50 = 220
AB의 1행 2열 = 1×20 + 2×40 + 3×60 = 280
AB의 2행 1열 = 4×10 + 5×30 + 6×50 = 490
AB의 2행 2열 = 4×20 + 5×40 + 6×60 = 640
인터랙티브 · 행렬-행렬 곱 한 칸씩 계산하기 값을 바꾸며 계산 규칙을 눈으로 확인하세요.

결과의 한 칸은 앞 행렬의 한 행과 뒤 행렬의 한 열을 같은 위치끼리 곱해 더한 값, 즉 내적입니다.

  • 2 × 3 행렬과 3 × 2 행렬의 곱은 왜 가능한가요?
  • 결과 행렬은 몇 행 몇 열인가요?
  • 결과의 1행 2열 칸은 앞 행렬의 어느 줄과 뒤 행렬의 어느 줄이 만나 만들어지나요?

9. 행렬을 변환으로 보기: 격자가 움직입니다

Section titled “9. 행렬을 변환으로 보기: 격자가 움직입니다”

행렬은 숫자표로만 볼 수도 있지만, 벡터를 움직이는 규칙으로 볼 수도 있습니다.

예를 들어 다음 행렬을 생각해 봅시다.

A = [ 2 0 ]
[ 0 1 ]

이 행렬은 x 방향은 2배로 늘리고, y 방향은 그대로 둡니다.

인터랙티브 · 2×2 행렬로 좌표 격자 변환하기 값을 바꾸며 계산 규칙을 눈으로 확인하세요.
기본 격자에서 시작합니다.

행렬의 첫 번째 열은 기본 x 화살표가 도착하는 곳, 두 번째 열은 기본 y 화살표가 도착하는 곳으로 볼 수 있습니다.

좌표평면의 기본 화살표 두 개를 생각해 봅시다. 선형대수학에서는 이런 기본 화살표를 기저벡터라고도 부릅니다.

i = [1, 0] x 방향 기본 화살표
j = [0, 1] y 방향 기본 화살표

2×2 행렬의 두 열은 이 기본 화살표들이 어디로 이동하는지를 나타낸다고 볼 수 있습니다.

A = [ a b ]
[ c d ]
첫 번째 열 [a, c] → i가 도착하는 곳
두 번째 열 [b, d] → j가 도착하는 곳

이 관점은 11주차 이후 A @ x를 단순 공식이 아니라 “벡터를 다른 위치로 보내는 계산”으로 이해하는 데 도움이 됩니다.


다음 주에는 위 개념을 NumPy 코드로 실행합니다.

이번 주 수학 표현11주차 NumPy 표현주의할 점
벡터1차원 배열 또는 2차원 열벡터 모양(3,)(3, 1)은 다름
행렬2차원 배열shape가 행과 열을 알려 줌
행렬 크기 m × narr.shape == (m, n)계산 전 먼저 확인
행렬 덧셈A + B보통 같은 shape 필요
원소별 곱A * B행렬곱이 아님
행렬곱A @ B, A @ x안쪽 크기 확인
행/열 방향 계산axis=0, axis=1어느 방향으로 모으는지 이해 필요

이번 주는 제출 실습 대신 아래 질문으로 이해도를 점검합니다.

  1. (2, 3)과 벡터 [2, 3]은 어떻게 다른가요?
  2. [2, 1] + [1, 3]의 결과를 성분별 계산과 화살표 그림으로 설명해 보세요.
  3. -2[1, 2]는 원래 벡터와 방향이 어떻게 달라지나요?
  4. 2 × 3 행렬에서 행과 열은 각각 몇 개인가요?
  5. 두 행렬을 더하려면 어떤 조건이 필요한가요?
  6. 3 × 2 행렬과 2 × 1 벡터를 곱하면 결과 크기는 무엇인가요?
  7. 2 × 3 행렬과 3 × 4 행렬의 곱은 가능한가요? 결과 크기는 무엇인가요?
  8. NumPy에서 A * BA @ B는 어떻게 다른가요?

11주차에서는 오늘 배운 벡터와 행렬을 NumPy 배열로 옮깁니다.

import numpy as np
A = np.array([[1, 2],
[3, 4],
[5, 6]])
x = np.array([10, 20])
print(A.shape) # (3, 2)
print(A @ x) # [ 50 110 170]

다음 주의 핵심은 세 가지입니다.

  1. 계산 전 shape를 확인한다.
  2. 원소별 연산과 행렬곱을 구분한다.
  3. axis가 어느 방향으로 값을 모으는지 이해한다.