안녕하세요. 오늘은 Tensorflow를 들어가기 전 주요 패키지인 NumPy(넘파이)에 대해서 알아보겠습니다. 우선 Basic이라고 하고 뒤에 Advance가 있을지 모르겠지만... 기본적인 것을 일단 알아보도록 하겠습니다.
- NumPy 란? .................................................................... (1)
- Matrix Creation ........................................................... (1)
- Matrix Manipulation ................................................. (1)
- Matrix Operation ........................................................ (2)
- Wrap-Up ........................................................................ (2)
1. NumPy 란?
제가 가장 좋아하는 방법인 다짜고짜 해당 것을 제공하는 원본 사이트에 들어가보기를 해봅니다.
NumPy는 Python 패키지이고, 기본적은 scientific computing을 위한 아이고... 여러가지 기능이 있는 것 같습니다. 사실 이 패키지는 Matrix를 쉽게 다루는 기능을 제공하는 패키지 입니다. 뒤에 계속 알아볼 머신러닝, 딥러닝에서 Matrix는 아주아주 기본적인 부분이기 때문에 이 NumPy가 이론적인 부분 뒤에 조작이나 연산을 도맡아서 해줄 겁니다.
또한, Anaconda에서는 기본적으로 설치되는 패키지로 따로 이를 위해서 pip install을 할 것도 없습니다. 그리고, 사실 2차행렬의 곱도 코딩으로 구하면 복잡한데... 3차원... 혹은 그 이상의 Matrix를 연산한다?? 전 일단 겁부터 나네요...
2. Matrix Creation
Matrix를 조작하던 연산을 하던 가장 시작은 일단 Matrix를 생성하는 일 입니다. 우선 Matrix를 생성하는 방법은 크게 3가지 입니다.
- List로 생성
- 특정값으로 생성
- 무작위 값으로 생성
이 이하의 실행코드는 다 Jupyter Notebook에서 작성하였으며, 따라해 보실 분들은 코드 밑에 #### 이 부분은 결과이니 그 위에 꺼만 입력하고 확인하시면 됩니다.
[List로 생성]
import numpy as np
python_list = [[1,2,3],[4,5,6],[7,8,9]]
mat_int = np.array(python_list, dtype=int)
mat_float = np.array(python_list, dtype=float)
print(mat_int)
print(mat_float)
##############################################
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
[특정값으로 생성]
Numpy에서는 다음과 같이 [행, 열] 크기를 지정하고, 그 안에 0으로 채울지 (zeros) / 1로 채을 울지 (ones) / 특정
값으로 채울지 (full) 매서드를 제공하고, 대각행렬을 생성하는 매서드도 제공합니다. 이 대각행렬은 향후에 one hot
을 위해서 사용이 될테죠... 이건 나중에 알게 되실 거에요.
mat_zero = np.zeros([3,4])
mat_one = np.ones([2,7])
mat_full = np.full([7,3], 10)
mat_eye = np.eye(4)
print(mat_zero)
print(mat_one)
print(mat_full)
print(mat_eye)
##############################
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1.]]
[[10 10 10]
[10 10 10]
[10 10 10]
[10 10 10]
[10 10 10]
[10 10 10]
[10 10 10]]
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
[무작위 값으로 생성]
random으로 생성하는 방법은 2가지가 있습니다. 평균과 표준편차의 지정된 분포로 임의의 값을 추출하는 (normal)
방식과... 최대 최소값의 지정된 범위에서 추출하는 (uniform) 방법입니다.
np.random.seed(123)
mat_rand_norm = np.random.normal(0, 1, [2,3])
mat_rand_uni = np.random.uniform(1, 20, [2,3])
print(mat_rand_norm)
print(mat_rand_uni)
##############################################
[[-1.0856306 0.99734545 0.2829785 ]
[-1.50629471 -0.57860025 1.65143654]]
[[19.63451977 14.01176503 10.13770613]
[ 8.45023285 7.52038231 14.85194444]]
이렇게 다양한 방법으로 Matrix Creation이 가능합니다.
3. Matrix Manipulation
이번엔 Matrix 조작기능입니다. 여러가지가 있겠지만... 주로 사용되는 5가지에 대해서 알아보겠습니다.
- Shape
- Transpose
- Indexing
- Expand Dimension
- Squeeze
[Shape]
해당 Matrix의 정보를 알려줍니다.
python_list = [[1,2,3],[4,5,6],[7,8,9]]
mat_int = np.array(python_list, dtype=int)
print(mat_int.shape)
#########################################
(3, 3)
[Transpose]
해당 배열의 전치행렬을 구해줍니다. 간단하게 2차원일 경우, 2x7 를 7x2으로 바꾸어 줍니다.
mat_one = np.ones([2,7])
mat_one_t = np.transpose(mat_one)
print(mat_one)
print(mat_one_t)
#################################
[[1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
하지만 다차원일때는 어떻게 동작할까요?? 뭐 단순합니다. 2x3x4는 4x3x2로 바꿔줍니다. 또한 전치 순서도 지정이
가능합니다. 순서의 지정은 axes parameter에 list형태로 위치값을 넣어주면 됩니다.
mat_one = np.ones([3,4,5,6])
mat_one_t = np.transpose(mat_one)
mat_one_r = np.transpose(mat_one, axes=[2,0,1,3])
print(mat_one.shape)
print(mat_one_t.shape)
print(mat_one_r.shape)
#################################################
생성 (3, 4, 5, 6)
default Trans (6, 5, 4, 3)
random Trans (5, 3, 4, 6)
[Indexing]
Matrix에서 특정값, 특정범위를 추출할때 사용합니다. 이는 Matrix의 원소, 행, 열, 행열로 추출이 가능합니다.
항상 파이썬에서 구간을 지정할때는 시작은 0부터 이며, 끝은 포함이 안된다는 것을 염두하면 됩니다.
python_list = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
mat_list = np.array(python_list)
print(mat_list)
print('\n원소추출 : ', mat_list[1,1])
print('1행 추출 : ', mat_list[0,:])
print('3열 추출 : ', mat_list[:,2])
print('행열 추출 : ', mat_list[1:3, 2:5])
###########################################################
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
원소추출 : 7
1행 추출 : [1 2 3 4 5]
3열 추출 : [ 3 8 13]
행열 추출 : [[ 8 9 10]
[13 14 15]]
[Expand Dimension]
생성된 배열에서 차원만 확장도 가능합니다. 확장은 원하는 위치에 차원을 추가하면 됩니다. 배열의 확장 및 축소는
나중에 아주아주 가끔 쓸수도 있으니 방법만 확인해 보겠습니다.
mat_234 = np.ones([2,3,4])
mat_1234 = np.expand_dims(mat_234, axis=0)
mat_12341 = np.expand_dims(mat_1234, axis=-1)
mat_123141 = np.expand_dims(mat_12341, axis=3)
print(mat_123.shape)
print(mat_1234.shape)
print(mat_12341.shape)
print(mat_123141.shape)
###############################################
(2, 3, 4)
(1, 2, 3, 4)
(1, 2, 3, 4, 1)
(1, 2, 3, 1, 4, 1)
[Squeeze]
axis를 안주면, 전체 차원 중 1인 애들을 다 축소 시켜주고, 값을 주면 해당 위치만 축소시켜 줍니다.
mat_squ_all = np.squeeze(mat_123141)
mat_squ_0 = np.squeeze(mat_123141, axis=0)
mat_squ_end = np.squeeze(mat_123141, axis=-1)
mat_squ_3 = np.squeeze(mat_123141, axis=3)
print(mat_squ_all.shape)
print(mat_squ_0.shape)
print(mat_squ_end.shape)
print(mat_squ_3.shape)
#############################################
(2, 3, 4)
(2, 3, 1, 4, 1)
(1, 2, 3, 1, 4)
(1, 2, 3, 4, 1)
NumPy는 둘로 나눠서... 나머지는 다음번에 알아보겠습니다.
-Ayotera Lab-
댓글