Hyun's Wonderwall

[AIchemist] 파머완 - CH01. 파이썬 기반의 머신러닝과 생태계 이해 (3. 넘파이) 본문

Study/Python-Machine-Learning

[AIchemist] 파머완 - CH01. 파이썬 기반의 머신러닝과 생태계 이해 (3. 넘파이)

Hyun_! 2023. 9. 18. 22:03

3. 넘파이

넘파이(NumPy): 파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 패키지.

많은 머신러닝 알고리즘이 넘파이 기반으로 작성되어있고, 알고리즘의 입출력 데이터 넘파이 배열 타입으로 사용함.

넘파이를 이해하는 것은 파이썬 기반 머신 러닝에서 매우 중요.

  • 루프를 사용하지 않고 대량 데이터 연산 가능 ->  빠른 배열 연산 속도를 보장.
    (과학, 공학 프로그램은 대량 데이터 계산 속도가 중요; 많은 파이썬 기반 과학, 공학 패키지들이 넘파이에 의존)
  • C/C++과 같은 저수준 언어 기반의 호환 API 제공.
    -> 파이썬 자체의 수행 성능 제약(느림)... 수행 성능이 매우 중요한 부분은 C/C++ 기반 코드로 작성하고 이를 넘파이에서 호출하는 방식으로 통합. (ex. 구글의 텐서플로: 이러한 방식으로 배열 연산 수행 속도 개선, 넘파이와 호환o)
  • 넘파이는 배열 기반 연산과 데이터 핸들링 가능. But 데이터 처리 시에... 편의성과 다양한 API 지원 측면에서 아쉬운 부분이 많음. So 데이터 핸들링을 할 때에는 판다스를 이용할 것임.(파이썬의 대표적인 데이터 처리 패키지, 편리)

넘파이의 기본 지식, 이 책에서 자주 사용되는 넘파이 API를 알아보자.

3.1. 넘파이 ndarray 개요

import numpy as np #넘파이 모듈 임포트 (numpy를 np로 alias함)

(import numpy만 해도 기능되나) as np를 추가해 약어 'np'로 모듈을 표현하는 게 관례. (*alias: 별명)

 

넘파이의 기반 데이터 타입: ndarray

[1 2 3] 와 같이 표현됨, 파이썬의 리스트와 달리 ','가 없다

-> 다차원 배열을 쉽게 생성, 다양한 연산 수행 가능

 

*아래에서 ndarray는 생성된 ndarray 배열을 말함

  • np.array( ) : 다양한 인자를 입력받아 ndarray로 변환하는 메소드. (리스트 등을 ndarray로 반환 시 사용)
  • ndarray.shape : ndarray의 크기, 즉 행과 열의 수를 튜플 형태로 가짐. 이를 통해 ndarray의 차원까지 알 수 있음.
    - 1차원: ex. (1, )
    - 2차원: (행의 수, 열의 수)
  • ndarray.ndim : ndarray의 차원을 숫자로 반환(1, 2, ...)

3.2. ndarray의 데이터 타입

  • ndarray 내 데이터 값은 숫자 값, 문자열 값, 불 값 모두 가능
  • ndarray.dtype : ndarray 내 데이터 타입 확인하는 속성. (int32, float64 등...)
    • ndarray 내 데이터 타입은 같은 데이터 타입만 가능.
      -> 만약 다른 데이터 타입이 섞여 있는 리스트를 ndarray로 변형 시, 더 큰 데이터 타입으로 형 변환 일괄 적용됨
  • ndarray.astype( ) :  ndarray  데이터 값 타입 변경 시 사용하는 메소드. 인자로 원하는 타입을 문자열로 지정.
    ex. array_int.astype('float64')    # array_int가 [1 2 3]에서 [1. 2. 3.]으로 타입 변경됨.

3.3. ndarray를 편리하게 생성하기 - arange, zeros, ones

일괄적으로 초기화할 때 많이 사용.

  • np.arange( ) : 인자로 stop 값 받아, 0부터 stop-1까지의 연속값으로 구성된 1차원 ndarray 생성.
    - start값도 부여 가능. array를 range( )로 표현한 것.
      ex. sequence_array = np.arange(10)과 같이 쓴다.
  • np.zeros( ) : 인자로 튜플 형태 shape 값을 받아, 모든 값을 0으로 채운 해당 shape의 ndarray를 반환.
  • np.ones( ) : 인자로 튜플 형태 shape 값을 받아, 모든 값을 1로 채운 해당 shape의 ndarray 반환.
    - 함수 인자로 dtype 정해주지 않으면 default는 float64
      ex. np.ones((1, 2)) 하면 [[1. 1. ]]이렇게 된다.

3.4. ndarray의 차원과 크기를 변경하는 reshape( )

  • ndarray.reshape( ) : ndarray를 특정 차원 및 크기로 변환. 지정된 사이즈로 변경 불가능하면 오류 발생.
    - 인자로 -1을 사용하면 원래 ndarray와 호환되는 새로운 shape로 변환.
      ex. array1의 shape가 (10, )일 때 array1.reshape(-1, 5)하면 (2, 5)로 변환, array1.reshape(5, -1)하면 (5, 2)로 변환. 그러나 (-1, 4)는 오류 발생할 것임.
    - reshape(-1, 1)과 같은 형태로 자주 사용됨. (특: 2차원, 1개 칼럼에 여러개의 로우.)
  • ndarray.tolist( ) : ndarray를 리스트 자료형으로 변환.

3.5. 넘파이 ndarray의 데이터 세트 선택하기 - 인덱싱(Indexing)

  1. 단일 값 추출
    특정한 데이터만 추출. 원하는 위치의 인덱스 값 지정.
    ex. array1[2]   # 두번째 값
          array1[-1]  # 맨 뒤 값 (-2로 하면 맨 뒤에서 두 번째)
          다차원은 array2d[2, 3]
  2. 슬라이싱
    연속된 인덱스상의 ndarray를 추출하는 방식. 'start:end' (*start에서 end-1 위치에 있는 ndarray를 반환.
    ex. array1[1:3]  # 인덱스 1, 2 요소 출력
    array[:3] # 인덱스 0부터 2까지의 요소 출력
    array[3:] # 인덱스 3부터 마지막까지의 요소 출력
    array1[:] # 인덱스 전체 출력

  3. 팬시 인덱싱
    일정한 인덱싱 집합을 리스트 또는 ndarray 형태로 지정해 해당 위치에 있는 ndarray 반환.
    ex. array2d[[0, 1], 2]
    array2d[[0, 1], 0:2]
  4. 불린 인덱싱
    특정 조건에 해당하는지 여부인 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 데이터의 ndarray를 반환.
    ex. array1d[array1d > 5]
    <불린 인덱싱이 동작하는 단계>
    (1) array1d > 5와 같이 ndarray의 필터링 조건을 [ ] 안에 기재
    (2) False값은 무시하고 True값에 해당하는 인덱스값만 저장
    *유의해야 하는 사항: True값 자체인 1을 저장하는 것이 아니라 True값을 가진 인덱스를 저장.
    (3) 저장된 인덱스 데이터 세트로 ndarray 조회

3.6. 행렬의 정렬 - sort( )와 argsort( )

행렬 정렬

  • np.sort( )
    # org_array = np.array([3, 1, 9, 5])
    ex. sort_array1 = np.sort(org_array)
    넘파이에서 sort( )를 호출, 인자로 행렬 대입. 원 행렬은 그대로 유지한 채 원 행렬의 정렬된 행렬을 반환.
  • ndarray.sort()
    ex. sort_Array2 = org_array.sort()
    원 행렬 자체를 정렬된 형태로 반환, 반환 값은 None임.
  • np.argsort( )
    ex. sort_indices = np.argsort(org_array)
    원본 행렬이 정렬되었을 떄 기존 원본 행렬의 원소에 대한 인덱스가 필요할때 np.argsort( )를 이용한다.
    정렬 행렬의 원본 행렬 인덱스를 ndarray 형으로 반환.
    *오름차순이 아닌 내림차순으로 정렬 시에는 np.argsort( )[::-1]와 같이 한다.
    sort_indices_desc = np.argsort(org_array)[::-1]
    *넘파이에서 매우 활용도가 높음

3.7. 선형대수 연산 - 행렬 내적과 전치 행렬 구하기

행렬 내적(행렬 곱) :  np.dot(_, _)

  np.dot(A, B) : 두 행렬 A와 B의 내적

  ex. dot_product = np.dot(A, B)

 

전치 행렬 : np.transpose( )

  ex. transpose_mat = np.transpose(A)

 


다음 글: CH01 - 4. 판다스

 

[AIchemist] 파머완 - CH01. 파이썬 기반의 머신러닝과 생태계 이해 (4. 판다스)

4. 판다스 판다스: 파이썬의 대표적인 데이터 핸들링 프레임워크. 고수준 API 제공. *판다스의 핵심 객체: DataFrame. CSV 등의 파일을 DataFrame으로 변경해 데이터의 가공/분석을 편리하게 해준다. *그

hereishyun.tistory.com