[Pytorch]

[Numpy 기초] Section 03. Crash Course:Numpy

이산이 2021. 12. 9. 14:55

Section 03. Crash Course:Numpy


해당 Section은 거대한 데이터를 다룰 수 있는 numpy array에 대해서 배우는 Section입니다.

Numpy array를 만드는 것부터 Indexing하고 특정 칼럼 혹은 값을 선택하는 방법, 일반적인 계산 방법 및 예제를 통해 Numpy에 대해서 익숙해지는 Section이 될 것입니다.

이미 Numpy에 익숙한 분은 다음 Section으로 넘어가시면 됩니다.

Section 01에서 왜 값자기 Section 03이 되었는가를 궁금해 하실 수 있습니다.

이건 사실 강의 자체에서 Section 01을 보았는지를 확인하는 단계를 Section 02로 둬서 그렇습니다.


0. Numpy-Array

Numpy array는 일반적인 list와는 다른 특성을 가지고 있습니다.

0.1 Numpy vs list

1. 행, 열 구분

  • 일반적인 list로 3 x 3 행렬을 만든다면 출력했을 경우 같은 줄에 출력됩니다.
  • Numpy array의 경우 행과 열이 구분되어 matrix의 형태를 취합니다.

2. Broadcasting

  • list에서 연산과 Numpy array에서의 연산은 다릅니다.
  • 이는 Broadcasting때문인데 일반적인 정수를 곱하거나 나누거나 빼거나 제곱하거나 하여도 matrix내의 값 전체에 각각 연산되어 결과물을 생성합니다.
# 예시
my_matrix = [[1,2,3],[4,5,6],[7,8,9]]
my_matrix

# 출력결과
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

np.array(my_matrix)

# 출력결과
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

0.2 기본 Numpy methods

.shape

Numpy array로 만든 matrix가 어떤 형상인지 확인하는 method입니다.

my_matrix = np.array(my_matrix)
my_matrix.shape

# 출력결과
(3, 3)

 

.arange(시작,끝,증가량)

시작 숫자부터 끝 숫자 전까지의 숫자로 Numpy array를 만듭니다.

np.arange(0,11,2)

# 출력결과
array([ 0,  2,  4,  6,  8, 10])

 

.zeros((형태))

0으로만 이루어진 Numpy array를 만들어냅니다.

np.zeros((5,5))

# 출력결과
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

 

.ones((형태))

1로만 이루어진 Numpy array를 만들어냅니다.

np.ones((3,3))

# 출력결과
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

 

.linspace(시작, 끝, 생성할 숫자 개수)

시작 숫자와 끝 숫자를 포함하여 해당 범위의 임의의 수 중에서 생성할 숫자 개수에 해당하는 숫자를 Numpy array로 만들어냅니다.

np.linspace(0,5,20)

# 출력결과
array([0.        , 0.26315789, 0.52631579, 0.78947368, 1.05263158,
       1.31578947, 1.57894737, 1.84210526, 2.10526316, 2.36842105,
       2.63157895, 2.89473684, 3.15789474, 3.42105263, 3.68421053,
       3.94736842, 4.21052632, 4.47368421, 4.73684211, 5.        ])

 

.eye(정수)

정수 x 정수 크기의 단위행렬을 만들어 냅니다.

np.eye(4)

# 출력결과
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

 

0.3 Numpy Random method

.rand(형태)

0에서 1사이의 임의의 수로 주어진 형태의 matrix를 생성합니다.

np.random.rand(5,5)

# 출력결과
array([[0.03932992, 0.80719137, 0.50145497, 0.68816102, 0.1216304 ],
       [0.44966851, 0.92572848, 0.70802042, 0.10461719, 0.53768331],
       [0.12201904, 0.5940684 , 0.89979774, 0.3424078 , 0.77421593],
       [0.53191409, 0.0112285 , 0.3989947 , 0.8946967 , 0.2497392 ],
       [0.5814085 , 0.37563686, 0.15266028, 0.42948309, 0.26434141]])

 

.randn(형태)

정규분포를 따르는 임의의 값으로 주어진 형태의 matrix를 생성합니다.

np.random.randn(5,5)

# 출력결과
array([[-0.45241033,  1.07491082,  1.95698188,  0.40660223, -1.50445807],
       [ 0.31434506, -2.16912609, -0.51237235,  0.78663583, -0.61824678],
       [-0.17569928, -2.39139828,  0.30905559,  0.1616695 ,  0.33783857],
       [-0.2206597 , -0.05768918,  0.74882883, -1.01241629, -1.81729966],
       [-0.74891671,  0.88934796,  1.32275912, -0.71605188,  0.0450718 ]])

 

.randint(최소값, 최대값, 개수)

최소 값과 최대 값 사이에서 주어진 개수만큼의 정수를 임의로 산출하여 Numpy array를 생성합니다.

np.random.randint(1,100,10)

# 출력결과
array([39, 50, 72, 18, 27, 59, 15, 97, 11, 14])

 

.seed(임의의 정수)

seed를 고정하여 random하게 생성하는 숫자들을 고정합니다.

np.random.seed(42)
np.random.rand(4)

# 출력결과
array([0.37454012, 0.95071431, 0.73199394, 0.59865848])

# 고정되어 한번 더 rand로 호출해도 값이 변경되지 않습니다.
np.random.seed(42)
np.random.rand(4)

# 출력결과
array([0.37454012, 0.95071431, 0.73199394, 0.59865848])

 

0.4 Reshape & ETC

arr.reshape(형태)

원하는 Numpy array의 형태를 변경할 수 있습니다. 단, 기존 형태에서 분해가 가능해야 합니다.

arr = np.arange(25)
arr.reshape(5,5)

# 출력결과
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

 

arr.max()

array에서 max값을 반환합니다.

arr.max()

# 출력결과
24

 

arr.min()

array에서 min값을 반환합니다.

arr.min()

# 출력결과
0

 

arr.argmax()

array에서 max값의 인덱스를 반환합니다.

arr.argmax()

# 출력결과
24

 

arr.argmin()

array에서 min값의 인덱스를 반환합니다.

arr.argmin()

# 출력결과
0

 

1. Numpy Indexing and Selection

list에서 인덱싱을 통해 값을 추출할 수 있듯이 Numpy array도 마찬가지로 값을 추출할 수 있습니다.

 

1.1 Bracket Indexing and Selection

Numpy array를 인덱싱 하는 방법은 일반적인 list에서 사용하는 방법과 유사합니다.

arr = np.arange(0,11)
arr

# 출력결과
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

# 이제 위에서 만든 arr를 활용하여 인덱싱 해보겠습니다.

arr[8]

# 출력결과
8

arr[1:5]

# 출력결과
array([1, 2, 3, 4])

arr[5:]

# 출력결과
array([ 5,  6,  7,  8,  9, 10])

 

1.2 Broadcasting

위에서도 언급한 부분이지만 Numpy array와 list의 차이점에 포함된 부분이기도 한 Broadcasting에대해서 알아보겠습니다.

Broadcasting은 단순한 연산에서도 사용되지만 인덱싱을 통한 값의 변경에도 활용이 됩니다.

arr[0:5]=100
arr

# 출력결과
array([100, 100, 100, 100, 100,   5,   6,   7,   8,   9,  10])

이렇게 인덱싱을 통해 값을 변경하거나 변수에 할당해서 사용할 때는 유의해야 하는 점이 있습니다.

인덱싱한 부분을 변수에 할당하더라도 원본과 연결되어있다는 점입니다.

arr = np.arange(0,11) # arr 초기화
slice_of_arr = arr[0:6]
slice_of_arr

# 출력결과
array([0, 1, 2, 3, 4, 5])

slice_of_arr[:]=99
slice_of_arr

# 출력결과
array([99, 99, 99, 99, 99, 99])

arr

# 출력결과
array([99, 99, 99, 99, 99, 99,  6,  7,  8,  9, 10])

위에서 보이듯이 slice_of_arr의 값을 변경하였음에도 불구하고 arr값도 변경된 것을 확인할 수 있습니다.

이를 방지하기 위해서 .copy()를 활용하여 완전 독립객체로 만들어 준 후 활용합니다.

 

1.3 Indexing a 2D array (matrices)

Numpy array는 단일 list형태뿐만 아니라 matrix형태의 경우에도 indexing을 제공합니다.

arr_2d = np.array(([5,10,15],[20,25,30],[35,40,45]))
arr_2d

# 출력결과
array([[ 5, 10, 15],
       [20, 25, 30],
       [35, 40, 45]])

arr_2d[1][0]

# 출력결과
20

arr_2d[:2.1:]

# 출력결과
array([[10, 15],
       [25, 30]])

 

matrix를 활용하다 보면 axis를 활용해서 계산을 해야하는 경우가 왕왕 있습니다.

axis에 대한 개념그림이 강의자료에 있어서 가져와 봤습니다.