본문 바로가기
Study/머신러닝

[1] 머신러닝 - numpy 기초

by 투말치 2021. 5. 4.

목차

    반응형

    머신러닝 분류

    1. 지도학습

    - 분류

    - 회귀

    - 추천 시스템

    - 시각/음성 감지/인식

    - 텍스트 분석(NLP)

     

    2. 비지도학습

    - 클러스터링

    - 차원 축소

     

    3. 강화학습

     

     

     

    넘파이

    넘파이의 기반 데이터 타입은 ndarray다.

    ndarray로 다차원 배열을 생성할 수 있다.

     

     

    #배열 생성
    array1=np.array([1,2,3])
    
    #배열의 형태 확인
    print(array1.shape)
    

    array1은 1차원이고 3개의 데이터를 가지기 때문에 

    출력 결과물은 (3, ) 이다.

     

    ndarray에 들어갈 수 있는 데이터 타입으로는 숫자, 문자열, bool 등 모두 가능하다.

    ndarray 안에서는 연산을 위해서 같은 데이터 타입만 존재해야 한다.

     

    그렇다면 ndarray를 만들 때 다른 타입의 데이터가 들어간 경우 어떻게 되는지 확인해보자.

    list2=[1, 2, 'test']
    array2=np.array(list2)
    print(array2.dtype)

    이 경우 int형의 데이터인 1과 2가 유니코드 문자열 값으로 변환한다.

    따라서 출력 결과물은 <U11 이다.

     

     

    nparray를 편하게 생성하는 방법

    np.arange(10)   #0부터 9까지 nparray의 데이터로 만들어줌
    
    np.zeros((3,2), dtype='int32') #(3,2)의 shape을 가지고 0으로 채원진 ndarray 생성
    
    np.ones((3,2)) # (3,2)의 shape을 가지고 1로 채워진 ndarray 생성

    - arange() : 연속적인 값으로 nparray 생성 가능

    - zeros() : 0으로 초기화해서 nparray 생성 가능

    - ones() : 1로 초기화해서 nparray 생성 가능

     

    위 코드에서 zeros 함수를 사용할 때 데이터 타입을 지정했는데, 만약 데이터 타입을 지정하지 않았을 경우 디폴트 값은 float64다.

     

     

    nparray의 차원과 크기 변경

    array1=np.arange(10)
    
    array2=array1.reshape(2,5)
    

    reshape() 함수를 사용하면 ndarray의 차원과 크기를 변환할 수 있다.

    array1은 1차원이고 데이터가 10개라서 2*5, 5*2 등으로 변환할 수 있다.

    만약 10*3으로 변환하려고 하면 오류가 발생하고 변경이 불가능하다.

     

    nparray를 효율적으로 사용하는 방법은 인자로 -1을 사용하는 것이다.

    array1=np.arange(10)
    array2=array1.reshape(-1, 5)
    array3=array1.reshpae(5,-1)
    
    print(array2.shape)
    print(array3.shape)
    

     

    첫 번째 출력 결과 : (2,5)

    두 번째 출력 결과 : (5,2)

    array2는 칼럼 인자인 5에 맞춰서 자동으로 변환하라는 뜻이고

    array3은 로우 인자인 5에 맞춰서 자동으로 변환하라는 뜻이다.

     

     

    넘파이에서 인덱싱하기

     

    1차원 ndarray에서 데이터 추출하기

    #단일 값 추출
    array1=np.arange(10)
    
    print(array1[2])

    array1은 [0 1 2 3 4 5 6 7 8 9]이기 때문에 해당 값의 결과는 1이다. 

    인덱스로 접근해서 데이터 수정도 가능하다.

     

    그렇다면 1차원이 아닌 2차원의 ndarray에서 데이터를 추출해보자.

    #앞에서 만든 array1을 변환해 array2를 만든다.
    array2=array1.reshape(3,3)
    
    print(array2[1,0])
    

    해당 값의 결과는 3이다

      col 0 col 1 col 2
    row 0 0 1 2
    row 1 3 4 5
    row 2 6 7 8

     

    불린 인덱싱

     

    조건 필터링과 검색에 사용할 수 있기 때문에 자주 사용되는 인덱싱이다.

     

    array1=np.arange(10)
    
    array2=array1[array1>5]
    print(array2)
    print(array1>5)

    첫번째 출력 결과 : [6 7 8 9]

    두번째 출력 결과 : [False, False, False, False, False, False, True, True, True, True]

     

    행렬 정렬

    np.sort()와 ndarray.sort()를 사용해서 행렬을 정렬할 수 있다.

    array1=np.array([3,1,9,5])
    
    sort_array1=np.sort(array1)
    print(sort_array1)

    출력 결과 : [1 3 5 9]

     

    *np.sort()와 ndarray.sort()의 차이점

    np.sort()는 원본 행렬은 변경하지 않고 정렬된 행렬을 반환한다.

    ndarray.sort()는 원본 행렬 자체를 정렬한다.

    두 함수 모두 디폴트가 오름차순이기 때문에 내림차순으로 정렬하고 싶으면[::-1]을 사용하면 된다.

    sort_array1=np.sort(array1)[::-1]

     

    행렬의 곱과 전치 행렬 구하기

     

    두 행렬을 곱하려면 다음과 같이 왼쪽 행렬의 행과 오른쪽 행렬의 열이 같아야 한다.

    A=np.array( [[1,2,3],[4,5,6]] )
    B=np.array( [[7,8],[9,10],[11,12]] )
    
    #행렬 곱
    dot_result=np.dot(A,B)

    행렬 곱을 할 때는 dot() 함수를 사용한다.

     

     

    *전치 행렬이란?

    원래 행렬에서 행과 열 위치를 교환한 원소로 구성한 행렬을 말한다.

    transpose()를 사용해서 전치 행렬을 구할 수 있다.

    A=np.array([[1,2], [3,4]])
    transpose_result=np.transpose(A)

     

     

     

     

     

     

    참고자료 : 파이썬 머신러닝 완벽 가이드

     

     

    반응형