ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ML-1] 파이썬 _ 넘파이(Numpy) 패키지
    머신러닝 2022. 1. 10. 16:45
    • 넘파이(Numpy) 패키지 : 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 패키지 

     

    1. Numpy 모듈 임포트

    import numpy as np

    - import numpy도 괜찮지만, 편의를 위해서 as np를 추가해 약어로 묘듈을 표현하는 것이 관례.

     

    2. ndarray

    #array() : 파이썬의 리스트와 같은 다양한 인자를 입력 받아서 ndarray(Numpy 기반 데이터 타입)로 변환하는 기능
    array1=np.array([1,2,3])
    array2=np.array([[1,2,3],[2,3,4]])
    array3=np.array([[1,2,3]])
    print('array1 array shape:',array1.shape) #shape변수는 ndarray의 크기 / (행,열) 튜플 형태
    print('array2 array shape:',array2.shape)
    print('array3 array shape:',array3.shape)
    [결과]
    array1 array shape: (3,)
    array2 array shape: (2,3)
    array3 array shape: (1,3)
    """
    array1과 array3의 차이를 분명하게 이해해야함.
    동일한 데이터 건수를 가지고 있지만 
    array1은 1차원, array3은 2차원 데이터임을 .shape를 통해 알 수 있음
    """

    - ndarray의 데이터 값은 모든 숫자, 문자열, boolean 모두 가능함.

    (단, ndarray내의 데이터 타입은 같은 데이터 타입만 가능함. 한개의 ndarray 객체 내에 int / float이 함께 있을 수 없음)

    array=np.array([1,2,3.0]) #[int,int,float]
    print(array,array.dtype)
    [결과]
    [1. 2. 3.] float64
    """
    이처럼 ndarray는 데이터 값이 모두 같은 타입이어야 하므로 
    서로 다른 데이터 타입이 섞여 있을 경우 
    데이터 타입이 더 큰 데이터 타입으로 변환됨
    """

    - astype() 메서드를 활용한다면 ndarray 내 데이터 값의 타입 변경이 가능함.

    (메모리 절약 가능)

    array_int=np.array([1,2,3])
    array_float=array_int.astype('float') #int타입의 데이터 값을 float타입으로 변경
    print(array_float,array_float.dtype)
    [결과]
    [1. 2. 3.] float64

    - reshape() 메서드는 ndarray의 차원과 크기를 변경함.

    array1=np.array([1,2,3,4,5,6,7,8,9])
    print('array1:\n',array1)
    array2=array1.reshape(3,3) #1차원 ndarray를 3x3 형태로 변경 
    print('array2:\n',array2)
    [결과]
    array1:
     [1 2 3 4 5 6 7 8 9]
    array2:
     [[1 2 3]
     [4 5 6]
     [7 8 9]]
     """
     지정된 사이즈로 변경이 불가능할 경우, 오류 발생
     """
    array1=np.array([1,2,3,4,5,6,7,8,9])
    print('array1:\n',array1)
    array2=array1.reshape(4,2) # 4x2 형태로는 변경이 불가능함
    print('array2:\n',array2)
    [결과]
    array1:
     [1 2 3 4 5 6 7 8 9]
    Traceback (most recent call last):
      File "		", line 5, in <module>
        array2=array1.reshape(4,2)
    ValueError: cannot reshape array of size 9 into shape (4,2)

    3. ndarray의 데이터 세트 _ 인덱싱(Indexing)

    - 단일 값 추출 

    array1=np.array([1,2,3,4,5,6,7,8,9])
    print('array1:\n',array1)
    print('3번째 데이터 값 출력:',array1[2]) # ndarray[원하는 위치의 index 값] 
    [결과]
    array1:
     [1 2 3 4 5 6 7 8 9]
    3번째 데이터 값 출력: 3
    """
    단일 index를 활용한다면 ndarray 내의 데이터 값도 수정 가능
    """
    array1[0]=13
    print('array1:\n',array1)
    [결과]
    array1:
     [13  2  3  4  5  6  7  8  9] # 0번째 index 데이터 값이 1 -> 13으로 변경
    """
    다차원 ndarray도 같은 방식으로 활용하면 됨
    (ex. 2차원 ndarray)
    """
    array1=np.array([[1,2,3],[4,5,6],[7,8,9]])
    print('array1:\n',array1)
    print('row=1, col=2:',array1[1,2]) # 2번째 행의 3번째 열 값 출력 
    [결과]
    array1:
     [[1 2 3]
     [4 5 6]
     [7 8 9]]
    row=1, col=2: 6
    """
    원래 ndarray에서는 row, col로 표현하지 않음
    axis0=row
    axis1=col 이라고 생각하면 됨
    다차원 ndarray는 axis 구분을 가짐
    (만약 3차원 ndarray라면, axis0,axis1,axis2 3개의 축을 가짐(행,열,높이)
    """

    - 연속 데이터 추출 : ':' 기호(슬라이싱)를 이용하여 연속한 데이터를 추출

    array1=np.array([1,2,3,4,5,6,7,8,9])
    print(array1[0:3])# [시작index:종료index+1]
    [결과]
    [1 2 3]
    """
    생략도 가능함
    """
    print(array1[:3]) # 0~2
    print(array1[3:]) # 3~8
    print(array1[:]) # 0~8
    [결과]
    [1 2 3]
    [4 5 6 7 8 9]
    [1 2 3 4 5 6 7 8 9]
    """
    다차원 ndarray의 경우 ','를 통해 row(axis0),col(axis1)을 지칭해줌
    """
    array1=np.array([[1,2,3],[4,5,6],[7,8,9]])
    print('[0:2,0:2]:\n',array1[0:2,0:2]) # row0~1/col0~1
    print('[:2,1:]:\n',array1[:2,1:]) # row0~1/col1~2
    [결과]
    [0:2,0:2]:
     [[1 2]
     [4 5]]
    [:2,1:]:
     [[2 3]
     [5 6]]

    - 불린 인덱싱(Boolean Indexing) : 조건 필터링과 검색을 동시에 할 수 있음

    array1=np.array([1,2,3,4,5,6,7,8,9])
    print(array1[array1>3]) # ndarray[조건] / '[]'내에 조건만 기재해주면 됨
    [결과]
    [4 5 6 7 8 9]

    4. 행렬의 정렬

    - np.sort() / ndarray.sort()

    방식1
    org_array=np.array([4,2,7,9,1])
    print('original:',org_array)
    sort_array=np.sort(org_array) # np.sort()는 원 행렬은 유지, 정렬한 행렬을 반환
    org_array.sort() # nparray.sort()는 원 행렬 자체를 정렬한 형태로 변환
    print('sort(by np.sort()):',sort_array)
    print('sort(by ndarry.sort()):',org_array)
    [결과]
    original: [4 2 7 9 1]
    sort(by np.sort()): [1 2 4 7 9] # sort()의 디폴트는 '오름차순'
    sort(by ndarry.sort()): [1 2 4 7 9]
    """
    내림차순으로 정렬하고 싶다면 .sort()[::-1] 형태로 사용하면 됨
    """
    org_array=np.array([4,2,7,9,1])
    print('original:',org_array)
    sort_array=np.sort(org_array)[::-1]
    print('sort:',sort_array)
    [결과]
    original: [4 2 7 9 1]
    sort: [9 7 4 2 1] # 내림차순

    5. 정렬된 행렬의 인덱스

    - argsort() : Numpy에서 활용도가 굉장히 높음

    org_array=np.array([4,2,7,9,1])
    sort_index=np.argsort(org_array) # [4,2,7,9,1]->[1,2,4,7,9]
    print(sort_index)
    [결과]
    [4 1 0 2 3] # 오름차순 정렬 후 index

    argsort() 메서드는 각각의 데이터를 별도의 ndarray로 가져야만 사용할 수 있음

    """
    학생의 이름을 저장한 ndarray와 해당 학생의 점수를 저장한 ndarray가 있다고 가정
    성적순으로 학생의 이름을 출력해보자
    """
    name_array=np.array(['Kim','Park','Lee','Jeong','Yoon'])
    score_array=np.array([88,67,97,100,84]) # 데이터는 따로 각각의 ndarray에 속해야 함
    sort_by_score=np.argsort(score_array) # 정렬된 데이터의 index 저장
    print('성적 순서대로 학생 이름 출력(오름차순):\n',name_array[sort_by_score])
    [결과]
    성적 순서대로 학생 이름 출력(오름차순):
     ['Park' 'Yoon' 'Kim' 'Lee' 'Jeong']

     

    '머신러닝' 카테고리의 다른 글

    [ML-2] 파이썬 _ 판다스(Pandas) 패키지  (0) 2022.01.11
    [ML-0] 머신러닝이란  (0) 2022.01.10

    댓글

Designed by Tistory.