[Numpy 기초] Section 03. Crash Course:Numpy
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에 대한 개념그림이 강의자료에 있어서 가져와 봤습니다.