Numpy 기초

김선재·2021년 9월 30일
0

Python 라이브러리

목록 보기
1/3
post-thumbnail
  • numpy는 내부적으로 C로 구현이 되어있어 속도가 빠르다.
  • 수치 연산에 관련된 방대한 라이브러리가 존재한다.
  • 일반 Python을 이용한 연산보다 훨씬 빠르다.
    • 고성능의 수치계산을 위해 제작
  • 배열 병렬 연산에 특화되어 있다.
    • 기본적으로 array라는 단위로 데이터를 관리하며 이에 대한 연산을 수행
import numpy as np 

numpy 라이브러리를 사용 하기 위해 np라는 이름으로 가져온 것

  1. 일반 파이썬 리스트를 numpy 배열화
    • numpy로 만든 배열을 ndarray라고 한다.
	py_list = [1, 2, 3] # 리스트 생성
	# 생성한 리스트 py_list를 np.array()를 통해 ndarray로 변환
	arr1 = np.array(pylist) 
    
	arr1
    ~~> array([1, 2, 3])

배열이 생성되었고, 타입을 확인해 보기위해 type(arr1)을 하게 되면

numpy의 ndarray로 되어 있는 것을 확인해 볼 수 있다.

배열의 종류

  1. 스칼라(scalar)
  • 0 차원 데이터라고 한다.
  • 단순한 값
  • `scalar_cal = 10
  1. 벡터(vector)
  • 1 차원 데이터라고 한다.
  • 스칼라가 연속적으로 모여있는 것
  • `vector_cal = [1, 2, 3]
  • 벡터 내에 데이터가 N개가 있으면 N 차원 벡터라고 한다.
  1. 행렬(matrix)
  • 2 차원 배열이라고 한다.
  • 1차원 배열인 벡터가 여러 개 모여있는 것
  • `matrix_val = [[1, 2, 3], [4, 5, 6]]
  1. 텐서(tensor)
  • 3 차원 이상의 배열을 의미한다.
  • Tensorflow는 Tensor 값이 그래프처럼 흐르는 거라고 생각하면 쉽다.
  • 텐서의 개념을 이용하면 모든 배열의 모양을 이야기 할 수 있다.
    • 스칼라( scalar ) : 0 Rank Tensor
    • 벡터( vector ) : 1 Rank Tensor
    • 행렬( matrix ) : 2 Rank Tensor

다차원 배열 만들기

✨ 리스트와 배열의 차이
리스트는 파이썬에 존재하는 모든 것을 담아낼 수가 있다.

  • list -> ['hello', 10, 123.456, True]
    배열은 보통 숫자 데이터만 들어가 있을때 배열이라고 한다.

np.arange()

  • 1차원 정수 배열 만들 때 사용
  • 파이썬의 range 함수와 매우 흡사
arr = np.arange(10)
arr 
~~> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.zeros()

  • 0으로 채워진 0벡터(zero-vector)를 만들 때 사용
np.zeros(5) # 1차원 배열에 5개의 0을 채운다.
~~> array([0, 0, 0, 0, 0])

np.zeros((3, 4, 5)) # 지정한 차원 수 대로 `0`으로 채워진 텐서 만들기
~~> 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.],
        [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.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]])

np.ones()

  • 1로 채워진 1벡터(one-vector)를 만들 때 사용
np.ones(5)
~~> array([1, 1, 1, 1, 1])

np.ones((3, 4, 5)) # 지정한 차원 수 대로 `1`로 채워진 텐서 만들기
~~> array([[[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., 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., 1., 1., 1., 1.]]])
        
np.ones((3, 4, 5)) * 3 # 지정한 차원 수 대로 `3`으로 채워진 텐서 만들기
~~> array([[[3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.]],

       [[3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.]],

       [[3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3.]]])

np.full()

  • 지정한 숫자로 채워진 벡터를 만들 때 사용
np.full((3, 4, 5), 3) # 배열의 모양(shape), 채울 숫자
~~> array([[[3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3]],

       [[3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3]],

       [[3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3],
        [3, 3, 3, 3, 3]]])

단위 행렬 만들기

  • 대각선의 방향의 원소가 1이고, 나머지는 0인 행렬

np.eye()

np.eye(3)
~~> array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

np.eye(3, 4)
~~> array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.]])

np.eye(5, 5)
~~> array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

구간 나누기( 사잇값 만들기 )

np.linspace()

  • 시작값과 끝값, 개수를 지정
np.linspace(1, 10, 3) # 1부터 10까지 균등하게 3개의 숫자를 만든다.
~~> array([ 1. ,  5.5, 10. ])

np.linspace(1, 10, 4)
~~> array([ 1.,  4.,  7., 10.])

np.linspace(1, 10, 5)
~~> array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ])

Random을 사용하기 위한 numpy

  • 랜덤 배열은 딥러닝에서 매개변수( 가중치, 편향 )을 초기화 하기 위해서 사용
  • 딥러닝에서는 일반적으로 활성화 함수에 따라서 Xavier 초기값, He 초깃값, 0.01 표준편차 정규분포 초깃값을 사용할 수 있다.

np.random.rand()

  • 완전 랜덤 만들기(정규분포나 균등분포가 아닌 완벽한 랜덤)
  • 0은 들어가지만 1은 들어가지 않는 균등분포( 각각의 변수가 나올 확률이 똑같은 분포 )로 부터 랜덤한 샘플을 추출하여 배열을 반환해주는 것
  • 따라서 음수의 값이 나올 수 없다.
np.random.rand(2, 3) # 랜덤값을 채울 차원을 지정
~~> array([[0.85695205, 0.16797547, 0.81858156],
       [0.04508979, 0.90062355, 0.12077676]]) # 랜덤하게 지정

np.random.randn()

  • 정규분포 랜덤 값 만들기
  • 표준 정규 분포( N(0, 1) 즉, 평균이 0이고 표준편차가 1인 분포 )에서 추출한 샘플을 리턴
  • 따라서 음수의 값이 나올 수 있다.
np.random.randn(10)
~~> array([ 1.62995024,  2.05857788,  1.31321747, -0.16884922, -0.80020921,
        0.97661084, -0.56047694,  0.87656974,  1.28965992,  2.80601732]) # 랜덤하게 지정

np.random.uniform()

  • 균등분포 랜덤 값 만들기
  • 구간들의 값들이 균등하게 분포
np.random.uniform(1.0, 3.0, size=(4, 5)) # 1.0 ~ 3.0까지의 균등분포를 4행 5열 사이즈로 랜덤 값 생성
~~> array([[1.5761483 , 1.88345273, 2.42165166, 1.35092032, 2.34578535],
       [2.64140406, 2.8769344 , 2.50453956, 2.11145305, 2.80381345],
       [2.54661575, 1.16479336, 2.67801323, 1.89666798, 1.04070194],
       [2.35784727, 1.89450568, 1.02591016, 1.58074891, 2.41453005]]) # 랜덤하게 지정

np.random.choice()

  • 정수 랜덤 샘플링 하기
  • 랜덤 샘플링 : 일정한 범위 내에서 필요한 정수를 랜덤으로 추출
  • 딥러닝에서는 mini-batch를 만들 때 사용한다.
np.random.choice(100, size=(3, 4)) # 기본은 중복을 허용하면서 추출
~~> array([[91, 35, 81, 88],
       [12, 68, 88, 74],
       [70, 61, 14, 66]])

숫자 내에서 랜덤하게 추출할 수도 있지만, 배열 내에서 랜덤하게 추출할 수도 있다.

arr = np.arange(1, 6) # arr = [1, 2, 3, 4, 5]
np.random.choice(arr, size=(2, 2))
~~> array([[1, 3],
       [5, 4]]) # arr에서 랜덤으로 숫자를 가져와 추출

np.random.randint()

  • 랜덤 정수 배열 만들기
arr1 = np.random.randint(1, 100, size=(5, )) # 1차원 배열의 원소에 5개의 1 ~ 100 사이 랜덤 값을 채운다
arr1
~~> array([48, 47, 29, 53, 44])

arr2 = np.random.randint(1, 100, size=(5, 1)) # 2차원 배열에 랜덤 정수 채우기
arr2
~~> array([[62],
       [38],
       [18],
       [16],
       [41]])

✨arr1과 arr2는 같은 배열이 아니다.

  • arr1은 1차원 배열, arr2는 2차원 배열

✨arr1과 arr2는 같은 벡터이다.

  • arr1 : numpy에서는 행 벡터의 모양을 하고 있지만, 실제로는 열 벡터이다.
  • arr2 : 열의 수가 1개인 열 벡터의 모양을 하고 있다.

💡모든 러신러닝 라이브러리( sklearn, tensorflow, pytoch, caffe 등 )에서는 기본적인 데이터 취급을 열 벡터로 하기 때문에 2차원 배열 이상부터 취급이 가능하다.
💡2 차원 데이터 이상부터 전치행렬 변환이 가능하다.

profile
data science!!, data analyst!! ///// hello world

0개의 댓글