[개발자를 위한 실전 선형대수학] 1.2 벡터 연산

[chapter 1] 벡터, 파트1 : 벡터와 벡터의 기본 연산 

1. 덧셈/뺄셈

덧셈도 서로 대응되는 원소끼리 더한다.

이 때, 동일한 차원을 갖는 벡터끼리만 가능하다.(3차원 벡터와 5차원 벡터를 더할 수 없다.)

$$  \begin{bmatrix}
4 \\
5\\
6
\end{bmatrix}+\begin{bmatrix}
10 \\
20 \\
30
\end{bmatrix}=\begin{bmatrix}
14 \\
25 \\
36
\end{bmatrix}$$

 

뺄셈도 두 벡터를 원소별로 뺀다.

$$ \begin{bmatrix}
4 \\
5\\
6
\end{bmatrix}-\begin{bmatrix}
10 \\
20 \\
30
\end{bmatrix}=\begin{bmatrix}
-4 \\
-15 \\
-24
\end{bmatrix}$$

 

파이썬에서는 아래와 같이 더할수 있다.

import numpy as np
v = np.array([4,5,6])
w = np.array([10,20,30])
u = np.array([0,3,6,9])
vPlusW = v + w
print(f'vPlusW:{vPlusW}') # vPlusW:[14 25 36]
uPlusW = u + w # ValueError: operands could not be broadcast together with shapes (4,) (3,)

 

방향이 다른 벡터를 더하면 아래와 같이 된다.

v = np.array([[4,5,6]]) # 행벡터
w = np.array([[10, 20, 30]]).T #열벡터
v+w
# array([[14, 15, 16],
#       [24, 25, 26],
#       [34, 35, 36]])

이렇게 되는 이유는 '브로드캐스팅(broadcasting)' 연산이 있기 때문이다.(뒤에서 나올 예정이라고 함)

🤔 궁금했던 점

분명 앞에서 3차원 행벡터는 np.array([ [4,5,6] ]) 로 만든다고 했던 것 같은데, 갑자기 위 예시에서는 np.array([4, 5, 6])을 더하고 있어서 뭐지? 싶었다.

결론은 프로그래밍에서의 '차원'과 수학에서의 '차원'이 같은 단어이지만 다른 의미로 쓰이고 있기 때문이다.

  • 수학에서의 '차원'
    • 성분의 개수
    • 성분이 3개면 = 3차원 벡터
  • NumPy에서의 '차원'
    • 배열의 중첩 구조(depth)
    • np.array([4,5,6]) 는 1차원 배열 = (3,)
    • np.array([[4,5,6]]) 는 2차원 배열 = (3,1)

파이썬(NumPy)에는 '벡터'라는 자료형은 없지만, np.array([1,2,3])처럼 생긴 1차원 배열을 벡터의 의미로 사용하는 것

즉, 배열을 벡터의 의미로 해석해 계산하는 것이다.

 

2. 스칼라-벡터 곱셈

선형대수학에서 스칼라(scalar)는 벡터나 행렬에 포함된 숫자가 아닌 수 그 자체

일반적으로 $\alpha$ 또는 $\lambda$와 같은 그리스어 소문자로 나타낸다.

 

스칼라-벡터 곱셈은 각 벡터 원소에 스칼라를 곱하는 것이다.

$$\lambda = 4, w = \begin{bmatrix}
9 \\
4 \\
1
\end{bmatrix}, \lambda w = \begin{bmatrix}
36 \\
16 \\
4
\end{bmatrix}$$

 

파이썬으로는 아래와 같이 계산할 수 있다.

s = 2
a = [3, 4, 5] # 리스트
b = np.array(a) # np 배열
print(a*s) # [3, 4, 5, 3, 4, 5]
print(b*s) # [ 6 8 10 ]

위 코드에서 a*s는 일반 리스트 반복이 되었고, b*s는 스칼라-벡터 곱셈이 되었다.

3. 스칼라-벡터 덧셈

벡터에 스칼라를 더하는 것은 선형대수학에서는 불가능하지만, 파이썬에서는 벡터에 스칼라를 더할 수 있다. 

이는 스칼라-벡터 곱셈과 유사하게 각 벡터 원소에 스칼라를 더하는 것이다.

s = 2
v = np.array([3,6]) 
print(s+v) # [5 8]

 

스칼라-벡터 곱셈은 기하학적으로 아래 그림처럼 이해할 수 있다.

https://m.blog.naver.com/chans900/223069791664

스칼라는 벡터의 방향을 바꾸지 않고 크기만 조정한다.

4. 전치(transpose)

전치 연산은 열벡터를 행벡터로 또는 반대로 변환한다.

$$ m_{i,j}^{T}=m_{j,i} $$

  • 행렬에는 행과 열이 있으므로 각 행렬 원소는 (행, 열) 인덱스를 가진다.
  • 전치연산은 단순히 이러한 인덱스를 맞바꾸는 것이다.
  • 벡터를 두 번 전치하면 원래 방향이 된다. ($v^{TT}=v$)

5. 파이썬에서 벡터 브로드캐스팅

브로드캐스팅 행렬 연산은 현대 컴퓨터 기반 선형대수학에서만 존재한다.

브로드캐스팅 연산은 한 벡터를 다른 벡터의 각 원소로 연산을 여러번 반복하는 것이다.

단계별로 살펴보면 아래와 같다. (이 부분은 ChatGPT 참고)

v = np.array([[4,5,6]])      # shape: (1, 3)
w = np.array([[10, 20, 30]]).T  # shape: (3, 1)

 

1. 벡터 형태 확인

  • v는 행벡터, 즉 1행 3열 → (1,3)
  • w는 열벡터, 즉 3행 1열 → (3,1)

2. v + w 연산

브로드캐스팅 규칙은 아래와 같다.

  • 각 배열의 shape를 오른쪽부터 비교
  • 차원이 맞지 않으면 1인 차원을 늘린다.
  • 두 차원이 다르고, 둘 중 하나가 1이면, 1인 쪽을 늘려서 맞춘다.
    • 번째 차원: 1 vs 3 → 1인 쪽(v)을 3으로 늘림
    • 두 번째 차원: 3 vs 1 → 1인 쪽(w)을 3으로 늘림

 

v → [[4,5,6],
      [4,5,6],
      [4,5,6]]

w → [[10,10,10],
      [20,20,20],
      [30,30,30]]

 

3. 최종 합산

v + w = [[ 4+10, 5+10, 6+10],
         [ 4+20, 5+20, 6+20],
         [ 4+30, 5+30, 6+30]]
       = [[14, 15, 16],
          [24, 25, 26],
          [34, 35, 36]]