Numpy 연산-1

Numpy 로 연산하기

Vector와 Scalar 사이의 연산

벡터의각 원소에 대해서 연산을 진행

\[x=\left(\begin{array}{l} 1 \\ 2 \\ 3 \end{array}\right) \quad c=5\]
import numpy as np
x = np.array([1,2,3])
c = 5

print(f"더하기 : {x+c}")
print(f"빼기 : {x-c}")
print(f"곱하기 : {x*c}")
print(f"나누기 : {x/c}")

더하기 : [6 7 8]
빼기 : [-4 -3 -2]
곱하기 : [ 5 10 15]
나누기 : [0.2 0.4 0.6]
 

Vector와 Scalar 사이의 연산

벡터의각 원소에 대해서 연산을 진행

\[y=\left(\begin{array}{l} 1 \\ 3 \\ 5 \end{array}\right) \quad z=\left(\begin{array}{c} 2 \\ 9 \\ 20 \end{array}\right)\]
y = np.array([1,3,5])
z = np.array([2,9,20])

print(f"더하기 : {y+z}")
print(f"빼기 : {y-z}")
print(f"곱하기 : {y*z}")
print(f"나누기 : {y/z}")
더하기 : [ 3 12 25]
빼기 : [ -1  -6 -15]
곱하기 : [  2  27 100]
나누기 : [0.5        0.33333333 0.25      ]

Array의 Indexing

Array에서 특정 위치의 원소를 가져오기

\[W=\left(\begin{array}{cccc} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \end{array}\right)\]
W = np.array([[1,2,3,4],
             [5,6,7,8],
             [9,10,11,12]])
W[0,0]
1
# 7을 가져오려면?
W[1,2]
7

Array의 Slicing

W = np.array([[1,2,3,4],
             [5,6,7,8],
             [9,10,11,12]])

"""
2,3  -> 행: 인덱스 0~1 -> [0:2]
6,7  -> 열: 인덱스 1~2 -> [1:3]
"""
W[0:2, 1:3]
array([[2, 3],
       [6, 7]])

Array의 Broadcasting

기본적으로 같은 Type의 $\operatorname{data}$ 에 대해서만 연산이 적용 가능 하지만 만약에 피연산자가 연산 가능하도록 변환이 가능하다면 연산이 가능 합니다. 이를 브로드 캐스팅 이라고 한다.

1. $M \times N, M \times 1$ 의 경우

기존의 선형대수 문제에서는 다음의 식이 연산이 불가능 하다 왜냐하면 행렬의 차원 수가 서로 다르기 때문이다.

\[\left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right)+\left(\begin{array}{l} 0 \\ 1 \\ 0 \end{array}\right)\]

브로드캐스팅

하지만, 브로드캐스팅을 적용하면 위의 연산이 다음과 같이 가능하다. 즉, 행령의 차원을 맞춰주여 연산아 가능하도록 하기 때문이다.

\[\left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right)+\left(\begin{array}{lll} 0 & 0 & 0 \\ 1 & 1 & 1 \\ 0 & 0 & 0 \end{array}\right)\]
a = np.array([[1,2,3],
            [4,5,6],
            [7,8,9]])

x = np.array([0,1,0])
x = x[:, None]

a + x
array([[1, 2, 3],
       [5, 6, 7],
       [7, 8, 9]])

2. $M \times N, 1 \times N$ 의 경우

이 연산을 브로드 캐스티을 적용 하면 다음과 같다.

\[\left(\begin{array}{lll} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right) \times\left(\begin{array}{ccc} 0 & 1 & -1 \end{array}\right)\]

브로드 캐스팅

\[\left(\begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array}\right) \times \begin{array}{ccc} 0 & 1 & -1 \\ 0 & 1 & -1 \\ 0 & 1 & -1 \end{array}\]

단, 이때의 연산을 행렬곱이 아니라 Element Wise 곱으로 계산 되는 점을 주의 해야 한다.

y = np.array([0,1,-1])
a * y
array([[ 0,  2, -3],
       [ 0,  5, -6],
       [ 0,  8, -9]])

3. $M \times 1, 1 \times N$ 의 경우

이 경우, 각 행렬은 행과 열이 각각 정보가 없기 때문에 이를 서로 옆의 행렬로 부터 행,렬 정보를 가져와서 브로드캐스티을 진행 한다. 다음과 같이 행렬이 존재한다고 가정해보자.

\[\left(\begin{array}{l} 1 \\ 2 \\ 3 \end{array}\right)+\left(\begin{array}{lll} 2 & 0 & -2 \end{array}\right)\]

브로드 캐스팅 적용

위의 식을 브로드 캐스팅을 적용하면 다음과 같은 계산이 가능 해진다.

\[\left(\begin{array}{ccc} 1 & 1 & 1 \\ 2 & 2 & 2 \\ 3 & 3 & 3 \end{array}\right)+\left(\begin{array}{ccc} 2 & 0 & -2 \\ 2 & 0 & -2 \\ 2 & 0 & -2 \end{array}\right)\]
t = np.array([1,2,3])
t = t[:, None]
u = np.array([2,0,-2])

t + u
array([[ 3,  1, -1],
       [ 4,  2,  0],
       [ 5,  3,  1]])