본문 바로가기
Data Science/머신러닝

numpy 라이브러리

by 코딩은 잼있어 2020. 6. 24.
728x90

numpy 라이브러리

  • 머신러닝에서는 숫자, 사람, 동물 등의 인식하기 위해 이미지데이터를 행렬도 변환하는것이 중요함
  • 행렬을 나타내기 위해 list를 사용할수도 있지만, 행렬연산을 위해 직관적이지도 않고 오류의 가능성이 높기때문에, 행렬연산을 위해 numpy사용이 필수다

0. 목차

  1. vector/ matrix 생성
  2. 행렬 사용법
    • 행렬 곱(dot product)
    • broadcast
    • index / slice / iterator
    • 전치행렬(transpose)
    • concatenate
  3. useful function ( loadtxt(), rand(), argmax(), ..........)

1. vector/ matrix 생성

(1) vector

  • vector는 np.array([....])를 사용하여 생성
  • shape: shape의 경우 해당 객체의 (행,렬)을 알려줌
  • ndim: 차원을 알려줌(ex) 1차원, 2차원 ...)

img

​ 출력

image-20200623152626939

(2) matrix

  • matrix는 np.array([...], [...], [...], ...)를 사용하여 생성

  • reshape: 내가 원하는 행렬로 다시 재구성 할수있음

    D = [1 2 3]  D.reshape(3,2)     [1 2]
        [4 5 6]        ===>         [3 4]
                                    [5 6]
        2 * 3 행렬                   3 * 2 행렬

image-20200623152844205

​ 출력

image-20200623152934041

2. 행렬 사용법

(1) 행렬 곱 (dot product)

  • A 행렬과 B 행렬의 행렬곱 (dot product)는 np.dot(A,B)로 나타내며, 행렬 A의 열벡터와 B행렬의 행벡터가 같아야한다.
  • 만약 같지 않다면, reshape 또는 전치행렬(transpose)등을 사용하여 행 변환 한 후에 행렬곱을 실행하자

(2) broadcast

그렇다면 행렬 곱이 머신러닝에서 어떻게 쓰일까 ???

  • 행렬 곱은 행렬의 원소 개수가 같아야만 계산할 수 있는 사칙연산의 한계를 벗어나 행렬곱 조건을 만족하는 다양한 크기의 행렬을 연속으로 만들고 행렬 곱을 연속으로 계산하면서 결과값을 만들 수 있기 때문에 머신러닝과 이미지프로세싱 분야에서 자주사용됨
  • numpy에서는 크기가 다른 두 행렬간에도 사칙연산을 할 수 있는데 이를 broadcast라고 지칭함
    • broadcast: 차원이 작은 쪽이 큰 쪽의 행 단위로 반복적으로 크기를 맞춘 후에 계산

아래의 예시는 A = 2 * 2 행렬, b = 스칼라값이다

img

  1. A + b를 할경우 차원이 낮은 b = 5가 차원이 큰 A의 행 단위로 크기를 맞춘뒤 계산을 해준다
  2. 그래서 b의 값을 모든 단위에 더해줘서 아래와 같이 출력된다.

img

위 과정이 broadcast라고 지칭함

(3) 전치행렬(transpose)

  • 전치행렬이란 어떤 행렬의 열은 행으로, 행은 열로 바꾼것으로서, 원본행렬이 A이라고 하면 전치행렬은 A^T로 나타냄
[1] matrix를 전치할경우

img

img

[2] vector를 전치할경우
  • 우선 reshape을 통해 스칼라인 vector를 matrix로 변환
    • reshape 리뷰: C 배열의 경우 [1,2,3,4,5]형태의 단순 vector구조임 ==> vector의 경우 matrix와의 연산을 위해 vector에서 matrix 바꿔야함 ==> C.reshape(1, 5)를 해여 1행 5열의 matrix형태로 바꿔줌
  • 그 다음, 전치를 진행

img

C와 E의 출력값을 비교하면 reshape의 기능을 확실히 알수있다.

img

(4) 행렬의 indexing / slicing / iterator

[1] indexing / slicing

  • 행렬 원소에서는 list처럼 indexing / slicing 모두 사용 가능함

img

  • A[0, 0] => 1행 1열을 의미, A[2, 1] => 3행 2열을 의미
  • A[0:-1, 1:2] => index가 0인 1행부터 index가 -1일땐 마지막 행을 의미함 근데 slicing할시 마지막 이전을 의미 하기 때문에 3행이 아닌 2행을 의미함 그리고 1:2의 경우 index가 1인 2열을 의미함
    • 1행 2열과 2행 2열인 20,40을 출력
  • A[:, 0] 에서 : 의 의미는 해당 행의 모든 행을 가져오자란 말, 그리고 index 가 0일땐 1열을 가져오자
    • 해당 행렬은 3행 2열이니까 1행1열, 2행 1열, 3행 1열을 가져오자

img

[2] iterator

  • 명시적(explicit) 인덱싱 / 슬라이싱 이외에, 행렬 모든 원소를 access 하는 경우에는 iterator 사용가능
  • 행렬의 모든 원소를 접근할때 순서는 행단위부터 시작
    • A행렬(2*4 행렬)의 경우 (0, 0) => (0, 1) => (0, 2) => (0, 3) => (1, 0) => (1, 1) => (1, 2) => (1, 3) 순서로 access(행단위부터 접근)

img

img

차후에 iterator를 이용하여 편미분 코드를 구현할예정이다

(5) concatenate

  • 행렬에 행(row) 또는 열(columm) 추가하기 위한 numpy.concatenate
    • 머신러닝의 회귀(regrssion) 코드 구현시 가중치와 bias를 별도로 구분하지 않고 하나의 행렬로 취급하기 위한 프로그래밍 구현 기술

img

  • concatenate를 이용하여 기존의 행렬에서 행 or 열에 추가가 가능하다.
  • B는 A에 새로운 행(아래)을 추가 (axis = 0)
  • C는 A에 새로운 열(오른)을 추가 (axis = 1)

img

3. useful function

(1) loadtxt

  • 파일 데이터를 읽고 행렬로 리턴하기때문에 인덱싱 or 슬라이싱으로 데이터를 분리 할 필요가 있음
  • 머신러닝 코드에서 입력데이터와 정답데이터를 분리하는 프로그래밍 기법

img

(2) rand

  • rand함수는 벡터나 행렬함수로 사용할 수 있으면 임의의 실수값을 랜덤하게 리턴해주는 함수
  • rand함수는 가중치나 bias를 임의로 설정할때 자주 사용됨

img

  • rand(3) ==> 스칼라값으로 출력
  • rand(1, 3) ==> 1행 3열의 행렬 출력
  • rand(3, 1) ==> 3행 1열의 행렬 출력

img

(3) sum, exp, log의 활용

  • np.sum, np.exp, np.log

img

img

(4) max, min, argmax, argmin

  • argmax는 최댓값이 있는 index를 리턴, 반면에 argmin는 최솟값이 있는 index를 리턴

img

  • axis = 0 일땐 열끼리 비교하고, axis = 1 일땐 행끼리 비교

  • np.max(X, axis=0) 의 경우 열끼리 비교하니까 (2,1,0), (4,2,5), (6,3,8) 을 비교

img

(5) ones, zeros

  • numpy.ones, numpy.zeros는 해당 자리에 1 or 0을 채우는 함수

img

img

나만의 numpy 정리

numpy 라이브러리는 행렬의 기능을 효과적으로 사용하기 위해 무조건 사용해야하만하는 라이브러리

numpy를 통해 행렬의 생성, 수정, 연산 등등 다양한 기능을 수행할수 있다!!!!

728x90