본문 바로가기
Tensorflow

[Tensorflow 2.0] 01. NumPy Basic (1)

by 청양호박이 2020. 1. 20.

안녕하세요. 오늘은 Tensorflow를 들어가기 전 주요 패키지인 NumPy(넘파이)에 대해서 알아보겠습니다. 우선 Basic이라고 하고 뒤에 Advance가 있을지 모르겠지만... 기본적인 것을 일단 알아보도록 하겠습니다. 

 

  • NumPy 란?    .................................................................... (1)        
  • Matrix Creation    ........................................................... (1)
  • Matrix Manipulation    ................................................. (1)
  • Matrix Operation    ........................................................ (2)
  • Wrap-Up    ........................................................................ (2)

 

1. NumPy 란?


 

제가 가장 좋아하는 방법인 다짜고짜 해당 것을 제공하는 원본 사이트에 들어가보기를 해봅니다.

https://numpy.org/

 

NumPy — NumPy

NumPy NumPy is the fundamental package for scientific computing with Python. It contains among other things: a powerful N-dimensional array object sophisticated (broadcasting) functions tools for integrating C/C++ and Fortran code useful linear algebra, Fo

numpy.org

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-

댓글