봉지라면의 봉지 속 이야기

BongjiNoodle's Packet Inside Story

나의 진솔담백한 이야기

컴퓨터공학/데이터분석기초실습

데이터분석기초실습] 7. 데이터 조작② (Numpy)

봉지라면 2022. 12. 5. 02:47
반응형

데이터 조작 (Numpy)

  • Numpy 라이브러리
    - Numpy란?
    - Numpy vs. Python
    - 인덱싱과 슬라이싱
    - Numpy 연산
    - 다차원배열
    - Numpy 함수

 

 

 


Numpy란?

  • NumPy: Numerical Python
    • 데이터 분석(수치 계산, 통계 등)을 위해 만들어진 파이썬 라이브러리
      - ex) 선형대수, 푸리에(Fouerier) 변환, 유사 난수 생성 가능
    • Numpy의 자료구조는 Pandas 라이브러리, matplotlib(시각화) 라이브러리의 기본 데이터 타입으로 사용
      - ex) 배열 생성, 저장, 색인(index) 처리, 벡터 연산 가능
    • NumPy는 C언어로 구현된 파이썬 라이브러리로, 메모리를 적게 차지하고 속도가 빠름

 

Numpy 사용이유

  • Python List vs. Numpy
    • 파이썬 List의 경우 여러개의 값들을 저장할 수 있는 자료구조로써 다차원의 배열을 표현할 수 있음 (생성, 추가, 제거 가능)
    • 파이썬 리스트는 리스트 간의 다양한 연산이 필요하지만 다양한 기능이 부족하고 데이터가 증가할수록 연산 속도가 느림
      - NumPy는 대용량 배열과 행렬 연산을 빠르게 수행
      - 고차원의 수학 연산자와 함수를 라이브러리 안에 포함

    • Numpy의 연산은 왜 빠를까?
      - NumPy는 각 배열마다 타입이 하나만 있다고 가정
      - 즉 배열 안에 동일한 타입의 데이터만 저장 가능(ex. 정수면 정수, 실수면 실수만)
      - 만약 여러 타입의 자료형을 사용하는 경우 NumPy에서는 문자열로 처리
    • 동일한 자료형을 사용하는 경우 데이터 항목에 대한 저장공간이 일정해짐
    • 즉 일정한 저장공간에서 빠르게 데이터에 접근하는 Random Access가 가능

    • (예제) 학생들의 중간고사와 기말고사 성적을 저장하고 있는 리스트가 제시되어 있고 표의 내용처럼 각 학생 별로 중간고사와 기말고사의 총점이라는 리스트를 만들고 싶음
        중간고사 성적 기말고사 성적 총점
      학생 #1 10 70 80
      학생 #2 20 80 100
      학생 #3 30 90 120
    • 파이썬 리스트 더하기 연산자는 두 리스트를 연결하므로, mid_scores + final_scores을 적용하면 다음과 같이 2개의 리스트를 연결한 리스트가 만들어짐
      total = mid_scores + final_scores
      total
      
      '''
      출력 결과
      [10 + 20 + 30 + 70 + 80 + 90]
      '''
      그러나 위는 우리가 원하는 연산대로 출력된 것이 아님!

    • 아래의 예제처럼 표현할 수도 있으나 Iteration으로 1개씩 값을 Open하고 계산하여 저장하는 형태의 구조를 가져야함
      mid_scores = [10, 20, 30]
      final_scores = [70, 80, 90]
      
      total = []
      for i in range(len(mid_scores)):
      	total.append(mid_scores[i] + final_scores[i])
      total
          
      '''
      출력 결과
      [80, 100, 120]
      '''
    • NumPy를 이용한다면 좀 더 간단한 구조로 연산이 가능

 

Numpy를 활용한 배열 연산

  • NumPy 사용 방법
    • Numpy 패키지
      import numpy as np
    • Numpy의 array() 함수를 이용한 배열 생성
      mid_scores = np.array([10, 20, 30])
      final_scores = np.array([60, 70, 80])
    • Numpy array 객체 연산
      total = mid_scores + final_scores
      print('시험성적의 합게: ', total)		#각 요소별 합계 출력
      print('시험성적의 평균: ', total/2)	#모든 요소를 2로 나눔
      
      '''
      출력 결과
      시험성적의 합계: [70, 90, 110]
      시험성적의 평균: [35, 45, 55]
      '''
  • NumPy 연산 기능
    • Numpy array에는 +, *와 같은 수학 연산자 적용 가능
      - 예를 들어 [220, 250, 230]이라는 배열에서 각 원소에 100씩 더한 값을 구하려면?
      import numpy as np
      salary= np.array([220, 250, 230])


    • 단순히 배열에 스칼라 값 100을 더하면 됨!
      salary= salary+100
      salary
      
      '''
      출력 결과
      [320, 350, 330]
      '''


    • 곱셈 연산도 가능 (정수, 실수, 모두 가능: 자동 형변환)
      salary= np.array([220, 250, 230])
      salary= salary*2
      salary
      
      '''
      출력 결과
      [440, 500, 460]
      '''

 

  • Numpy를 활용한 간단한 연산
    • 다음과 같은 연산의 결과를 출력해보자
      import numpy as np
      
      a= np.array(range(10)) #range(A): 0부터 A-1까지의 정수 반환
      b= np.array(range(1, 11)) #range(A, B): A부터 B-1까지의 정수 반환
      c= np.array(range(10, 101, 10)) #range(A, B, C): A부터 C 숫자만큼의 간격으로 B-1까지의 정수 반환
      
      a+b+c, a-b-c, a*b*c*, a/b, a/c
      
      '''
      출력 결과
      (array([ 11,  23,  35,  47,  59,  71,  83,  95, 107, 119]),
       array([ -11,  -21,  -31,  -41,  -51,  -61,  -71,  -81,  -91, -101]),
       array([   0,   40,  180,  480, 1000, 1800, 2940, 4480, 6480, 9000]),
       array([0.        , 0.5       , 0.66666667, 0.75      , 0.8       ,
              0.83333333, 0.85714286, 0.875     , 0.88888889, 0.9       ]),
       array([0.        , 0.05      , 0.06666667, 0.075     , 0.08      ,
              0.08333333, 0.08571429, 0.0875    , 0.08888889, 0.09      ]))
      '''
  • Numpy를 활용한 다양한 산술 연산
    import numpy as np
    
    a= np.array([1, 2.5, 4.0, 5.5, 7.0]) #np.array함수를 사용한 값을 변수 a에 저장
                                         #변수 a의 4번째 자리부터 출력
                                         
    '''
    출력 결과
    array([ 5.5, 7. ])
    '''
  • 합계, 표준편차, 누적합
    import numpy as np
    
    a= np.array([1, 2.5, 4.0, 5.5, 7.0]) #1은 자동적으로 형변환 수행 1.0
    
    print("합계", a.sum())
    print("표준편차", a.std())
    print("누적합", a.cumsum())
    
    '''
    출력 결과
    합계 20.0
    표준편차 2.1213203435596424
    누적합 [ 1.   3.5  7.5 13.  20. ]
    '''
  • 벡터화된 형식의 수학 연산
    print("변수 a의 값을 출력",a)
    print("변수 a의 값에 2를 곱한 값 출력", a*2)
    print("변수 a의 값에 2를 제곱한 값 출력",a**2)
    print("변수 a의 값에 루트를 적용한 값을 출력",np.sqrt(a))
    
    '''
    출력 결과
    변수 a의 값을 출력 [1.  2.5 4.  5.5 7. ]
    변수 a의 값에 2를 곱한 값 출력 [ 2.  5.  8. 11. 14.]
    변수 a의 값에 2를 제곱한 값 출력 [ 1.    6.25 16.   30.25 49.  ]
    변수 a의 값에 루트를 적용한 값을 출력 [1.         1.58113883 2.         2.34520788 2.64575131]
    '''

Numpy에서의 인덱싱과 슬라이싱

Numpy에서도 리스트와 동일하게 인덱싱과 슬라이싱 가능

scores= np.array([88, 72, 93, 94, 89, 78, 99])

 

  • 인덱싱 2 지정, 마지막 요소 접근
    a= scores[2], scores[-1]
    a
    
    '''
    출력 결과
    (93, 99)
    '''


  • 슬라이싱(마지막 항목 인덱스가 4일 때에는 4-1 scores[4]항목까지 슬라이싱)
    a= scores[1:4],scores[3:0], scores[4:-1]
    a
    
    '''
    출력 결과
    (array([72, 93, 94]), array([], dtype=int32), array([89, 78]))
    '''
  • 생략 및 음수 인덱싱
    ages= np.array([18, 19, 25, 30, 28])
    
    '''
    출력 결과
    (array([72, 93, 94]), array([], dtype=int32), array([89, 78]))
    '''


Numpy에서의 인덱싱과 슬라이싱

논리적인 인덱싱

  • 논리적인 인덱싱(logical indexing)이란 어떤 조건을 주어서 배열에서 원하는 값을 추려내는 것
    - ex. 사람들이 나이가 저장된 NumPy 배열 ages에서 20살 이상인 사람만 추출
반응형