포스트

배열(array)과 표(Table)

Data를 어떻게 표현하면 좋을까? 배열(array)와 표(table)

list와 array

  • List

    • 여러 유형의 데이터 타입을 포함할 수 있다.
    • negative indexing을 지원한다.
    • 대괄호 안에 값을 넣어 사용하며, List의 내용은 파이썬 내장 함수를 사용하여 쉽게 병합하고 복사할 수 있다.
  • array

    • 동일한 데이터 타입을 포함하는 벡터이다.
    • 배열의 크기는 고정되어 있다.
    • List에 비해 삽입 및 삭제 비용이 높지만 인덱싱이 빠르다.
  • List와 array의 차이점

    목록Listarray
    다른 데이터 타입 구성가능불가능
    명시적인 모듈 선언불필요필요
    산술 연산직접 처리 불가직접 처리
    적합한 항목 시퀀스짧은 데이터긴 데이터
    유연성높음낮음
    명시적 루프불필요필요
    메모리 크기작음
  • 중앙값 코드 구현하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    def median(nums):
      num.sort() #정렬
      size = len(nums)
      p = size // 2
      if size % 2 == 0: #size가 짝수이면
        pr = p
        pl = p-1
        mid = float((nums[pl]+nums[pr])/2)
      else:
        mid = nums[p]
      return mid
      
    print('X: ',X)
    median(X)
    
  • 표준편차 코드 구현하기

    1
    2
    3
    4
    5
    6
    7
    
    def std_dev(nums, avg): #avg는 평균 함수로 구한 평균
      texp = 0.0
      for i in range(len(nums)):
        texp = texp + (nums[i] - avg)**2
      return (texp/len(nums)) ** 0.5
      
    std_dev(X, avg)
    

위와 같은 방법으로 연산하는 함수를 구현할 수 있다. 하지만 numpy를 사용하면,

  • 빠르고 메모리를 효율적으로 사용하며 다양한 연산을 지원하는 다차원 배열 ndarray 데이터 타입 지원
  • 반복문을 작성할 필요 없이 전체 데이터 배열에 대해 빠른 연산을 제공하는 표준 수학 함수 제공
  • 배열 데이터 디스크에 저장하거나 불러오기 가능
  • 선형대수, 난수발생기, 푸리에 변환 가능

이런 기능을 편리하게 사용할 수 있다.

NumPy

  • install

    1
    
    pip install numpy
    
  • import

    1
    
    import numpy as np
    
  • ndarray 만들기

    1
    2
    3
    4
    
    A = np.arange(5)
    B = np.array([0,1,2,3,4])
      
    #둘의 결과는 동일하다.
    
  • 크기

    1
    2
    3
    
    ndarray.size # 행렬의 모양
    ndarray.ndim # 행렬의 축 개수
    ndarray.shape # 행렬 내 원소의 개수 
    
  • reshape()

    1
    
    np.arange(10).reshape(2,5)
    

    모양과 원소의 개수를 맞춰주어야 한다.

    예) 원소 10개의 ndarray는 (3,3)으로 reshape할 수 없다.

  • type

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    A = np.array([0,1,2,3,4,5])
    print(A)
    print(A.dtype) #int64
    print(type(A)) #<class 'numpy.ndarray'>
      
    B = np.array([0,1,2,3,'4',5])
    print(B)
    print(B.dtype) #<U21
    print(type(B)) #<class 'numpy.ndarray'>
      
    C = np.array([0,1,2,3,[4,5],6])
    print(D)
    print(D.dtype) #object
    print(type(D)) #<class 'numpy.ndarray'>
    
    • numpy: numpy.array.dtype
      • 동일한 데이터 타입
      • NumPy ndarray 원소의 데이터 타입 반환
    • Python: type()
      • 행렬 A의 자료형 반환
    • ndarray 안에 list가 들어갔을 때 dtype이 object를 반환함: warning 문구를 통해 경고
  • 특수 행렬

    • 단위행렬

      1
      
      np.eye(3)
      

      [6]:

      array([[1., 0., 0.],
             [0., 1., 0.],
             [0., 0., 1.]])
      
    • 0 행렬

      1
      
      np.zeros([2,3])
      

      [7]:

      array([[0., 0., 0.],
             [0., 0., 0.]])
      
    • 1 행렬

      1
      
      np.ones([3,3])
      

      [8]:

      array([[1., 1., 1.],
             [1., 1., 1.],
             [1., 1., 1.]])
      

  • 브로드캐스트

    ndarray와 상수 또는 서로 크기가 다른 ndarray끼리 산술연산이 가능한 기능

    1
    
    A = np.arange(9).reshape(3,3)
    

    [9]:

    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    1
    
    A*2
    

    [10]:

    array([[ 0,  2,  4],
           [ 6,  8, 10],
           [12, 14, 16]])
    
    1
    
    A+2
    

    [11]:

    array([[ 2,  3,  4],
           [ 5,  6,  7],
           [ 8,  9, 10]])
    
    1
    2
    3
    4
    5
    
    A = np.arange(9).reshape(3,3)
    B = np.array([1, 2, 3])
    print("A:", A)
    print("B:", B)
    print("\nA+B:", A+B)
    
    A: [[0 1 2]
     [3 4 5]
     [6 7 8]]
    B: [1 2 3]
      
    A+B: [[ 1  3  5]
     [ 4  6  8]
     [ 7  9 11]]
    
    1
    2
    3
    4
    5
    
    A = np.arange(9).reshape(3,3)
    D = np.array([1, 2])
    print("A:", A)
    print("D:", D)
    print("\nA+D:", A+D)
    
    A: [[0 1 2]
     [3 4 5]
     [6 7 8]]
    D: [1 2]
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    /tmp/ipykernel_14/3123796488.py in <module>
          4 print("A:", A)
          5 print("D:", D)
    ----> 6 print("\nA+D:", A+D)
      
    ValueError: operands could not be broadcast together with shapes (3,3) (2,) 
    

​ (3,3)에 (1,3), (3,3)에 (3,1)은 연산이 가능하지만 (3,3)에 (1,2)는 불가능하다.

  • random

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    np.random.random() # 0에서 1 사이의 실수형 난수 생성
    np.random.randint(a,b) # a에서 b-1 사이의 정수형 난수 생성
    np.random.choice([list]) # 리스트에 주어진 값 중 하나를 랜덤하게 골라줌
      
    np.random.permutation(a) # 0에서 a-1까지의 리스트의 요소가 무작위로 섞인 배열 생성
    np.random.permutation([list]) # 리스트의 요소가 무작위로 섞인 배열 생성
      
    np.random.normal(loc=m, scale=s, size=n) # 평균 m, 표준편차 s인 정규분포를 따르는 변수 n개 추출
    np.random.uniform(low=d, high=u, size=n) # 최소값 d, 최대값 u인 균등분포를 따르는 변수 n개 추출
    
  • 전치행렬

    • arr.T

      행렬의 을 맞바꾼다.

      1
      2
      3
      4
      
      A = np.arange(24).reshape(2,3,4)
      print("A: ", A)
      print("A의 전치행렬: ", A.T)
      print("A의 전치행렬의 shape: ", A.T.shape)
      
      A: [[[ 0  1  2  3]
        [ 4  5  6  7]
        [ 8  9 10 11]]
          
       [[12 13 14 15]
        [16 17 18 19]
        [20 21 22 23]]]
      A의 전치행렬: [[[ 0 12]
        [ 4 16]
        [ 8 20]]
          
       [[ 1 13]
        [ 5 17]
        [ 9 21]]
          
       [[ 2 14]
        [ 6 18]
        [10 22]]
          
       [[ 3 15]
        [ 7 19]
        [11 23]]]
      A의 전치행렬의 shape: (4, 3, 2)
      
    • np.transpose

      을 기준으로 행렬의 행과 열을 맞바꾼다.

      1
      2
      3
      4
      
      B = np.transpose(A, (2,0,1))
      print("A: ", A)
      print("B: ", B)
      pirnt("B.shape: ", B.shape)
      
      A: [[[ 0  1  2  3]
        [ 4  5  6  7]
        [ 8  9 10 11]]
          
       [[12 13 14 15]
        [16 17 18 19]
        [20 21 22 23]]]
      B: [[[ 0  4  8]
        [12 16 20]]
          
       [[ 1  5  9]
        [13 17 21]]
          
       [[ 2  6 10]
        [14 18 22]]
          
       [[ 3  7 11]
        [15 19 23]]]
      B.shape: (4, 2, 3)
      
  • 데이터의 행렬 변환

    • 소리 데이터: 1차원 array로 표현한다. CD음원파일의 경우, 44.1kHz의 샘플링 레이트로 -32767~32768의 정수 값을 갖는다.
    • 흑백 이미지: 이미지 사이즈의 2차원 ndarray로 나타내고, 각 원소는 픽셀별로 명도를 0~255의 숫자로 환산하여 표시한다. 0은 검정, 255는 흰색이다.
    • 컬러 이미지: 이미지 사이즈의 3차원 ndarray로 나타낸다. 세로X가로X3 형태이며, 3은 RGB 3색을 의미한다.
    • 자연어: 임베딩(Embedding)이라는 과정을 거쳐 ndarray로 표현될 수 있다. 예를 들어 71,290개의 단어가 있는 문장으로 이루어진 데이터셋이 있을 때, 이를 단어별로 나누고 0~71,289로 넘버링한다. 이를 토큰화 과정이라고 한다. 이 토큰을 50차원의 word2vec embedding을 통해 [batch_size, sequence_length, embedding_size]의 ndarray로 표현할 수 있다.
  • 이미지의 행렬 변환

    • 픽셀과 이미지

      • 이미지는 수많은 픽셀들로 구성되어 있다.
      • 각각의 픽셀은 RGB 3개 요소의 튜플로 색상이 표시된다.
      • 흑백의 경우에는 Gray 스케일로 나타낸다.
      • Color는 투명도를 나타내는 A를 포함해 RGBA 4개로 표시하기도 한다.
      • 이미지의 좌표는 보통 왼쪽 위를 (0,0)으로 표시한다.
    • 이미지와 관련된 파이썬 라이브러리

      • matplotlib
      • PIL
    • 간단한 이미지 조작

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      from PIL import Image, ImageColor
      img = Image.open(path) # 이미지 파일 open, dtype: PIL.JpegImagePlugin.JpegImageFile
      W, H = img.size #이미지 가로*세로 사이즈 튜플 값으로 반환
      print((W,H))
      print(img.format) # 이미지 파일 타입
      print(img.mode) # 이미지 색상 정보
      img.crop((30,30,100,100)) # 인자로 가로와 세로의 시작점,종료점 총 4개를 받아 자른다.
      img.save(filename) # 저장
      img_arr = np.array(img) # 이미지를 행렬로 변환
      Image.open(path).convert('L') # convert('L')로 흑백 처리
      ImageColor.getcolor('RED', 'RGB') # 색이 rgb값으로 어떻게 표현되는지 반환
      

Pandas

Pandas의 특징

  • NumPy 기반
  • 축의 이름에 따라 데이터를 정렬할 수 있음
  • 다양한 방식의 indexing
  • 시계열 데이터와 비시계열 데이터를 함께 다룰 수 있음
  • 누락 데이터 처리 가능
  • 데이터를 합치고 관계 연산을 수행할 수 있음

Series

  • 일련의 객체를 담을 수 있는, 1차원 배열과 비슷한 자료 구조

  • Series.values

    1
    2
    3
    
    import pandas as pd
    ser = pd.Series(['a','b','c',3])
    ser.values
    

    [3]:

    array(['a', 'b', 'c', 3], dtype=object)
    
  • Series.index

    1
    
    ser.index
    

    [4]:

    RangeIndex(start=0, stop=4, step=1)
    
  • Series 인덱스 설정

    1
    2
    
    ser2 = pd.Series(['a', 'b', 'c', 3], index=['i','j','k','h']) # Series의 인자로 넣기
    ser2.index = ['i', 'j', 'k', 'h'] # 할당 연산자
    

    [5]:

    i    a
    j    b
    k    c
    h    3
    dtype: object
    
  • NumPy와 Series의 차이점

    차이점NumPySeries
    인덱싱0으로 시작하는 정수형 인덱스사용자 지정
    데이터 타입단일 데이터 타입각 요소마다 다른 데이터 타입 가능
    누락 데이터 처리누락 데이터 표현 안 함누락 데이터 NaN으로 표시

DataFrame

  • 표(table)과 같은 자료구조

  • Series/DataFrame 변환

    1
    2
    
    pd.Series(dataframe) # DataFrame to Series
    pd.DataFrame(series) # Series to DataFrame
    
  • Pandas 통계 관련 메서드

    1
    2
    3
    4
    5
    6
    7
    8
    
    df.count() # NA 제외한 수 반환
    df.describe() # 요약 통계 계산
    df.argmin() # 최소값을 가지고 있는 값 반환
    df.argmax() # 최댓값을 가지고 있는 값 반환
    df.idxmin() # 최소값을 가지고 있는 인덱스 반환
    df.idxmax() # 최대값을 가지고 있는 인덱스 반환
    df.consum() # 누적합 계산
    df.pct_change() # 퍼센트 변화율 계산
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.