본문 바로가기

Dev/AI 인공지능

[AI] 파이썬과 넘파이 (Numpy) | ndarray | element-wise operation | broadcasting | reshape | flatten

728x90

Numpy란?

  • Numerical Python
  • 파이썬의 고성능 과학 계산용 패키지
  • Matrix Vector와 같은 Array 연산의 사실상 표준
  • 일반 리스트에 비해 빠르고, 메모리 효율적
  • 반복문 없이 데이터 배열에 대한 다양한 처리를 지원
  • import numpy as np

 

 

Numpy와 배열 (ndarry)

  • numpy를 이용한 배열 생성 → ndarray 객체
  • 한가지 데이터 타입만 저장 가능! Dynamic typing is not supported!
  • test_array = np.array([1, 2, 3, 4], float)
    변수명 = np.array(리스트, 데이터타입)
  • 기존의 파이썬에서 리스트와 같이 데이터의 메모리가 연속적으로 저장되어 있음
    → 연산에서 이점이 있음
    → 메모리의 크기가 일정하여 저장 효율이 좋음
    → 메모리값을 비교하는 is() 함수를 사용했을 때, 같은 값이더라도 메모리값이 달라서 False가 나옴 (참고: https://codechacha.com/ko/python-difference-between-is-and-equals/)
  • ndarray 의 타입 확인: ndarray.dtype
    - 한 종류의 데이터 타입만 저장할 수 있음!
    - 데이터 타입은 C의 data type과 compatible 
  • ndarray 의 모양 확인: ndarray.shape
    - rank 0: scalar
    - rank 1: vector
    - rank 2: matrix
    - rank 3: 3-tensor
    - rank n: n-tensor
  • ndarray object의 메모리 크기 확인: ndarray.nbytes
  • ndarray의 차원의 수: ndarray.ndim
  • ndarray의 데이터의 수: ndarray.size

 

 

ndarray의 shape 다루기

  • reshape(): array의 shape의 크기를 변경함. 데이터의 갯수와 데이터의 순서는 동일함
    - 자동 할당 X: 할당이 일어난 것이 아니기 때문에 원본은 그대로임에 유의!
🔥 TIP! 🔥
-1 : size를 기반으로 row 개수를 선정
ex) np.array(test_matrix).reshape(-1, 2).shape  # 전체 데이터가 8개인 경우 (4, 2)가 됨
  • flatten(): 다차원 array를 1차원 array로 변환 (reshape의 하나의 기능을 또다른 함수로 만든격) - 자동 할당 X
  • indexing & slicing:인덱스 값을 사용하여 데이터에 접근 및 추출
    - 파이썬의 list와 달리 행과 열 부분을 나눠서 slicing이 가능함
    - 띄엄띄엄 추출도 가능함 (예: arr[:, ::2])

네이터 부스트캠프 AI Tech 5기 강의자료에 포함된 자료입니다

 

 

ndarray creation

  • arange(): array의 범위를 지정하여, 값의 list를 생성하는 명령어
  • zeros(): 0으로 가득한 ndarray 생성
  • ones(): 1로 가득찬 ndarray 생성
  • empty(): shape만 주어지고 비어있는 ndarray 생성 - memory initialization이 되지 않아서,
  • 이전 값이 남아있음
  • np.zeros_like(), np.ones_like(), np.empty_like()
  • identity(): 단위 행렬(i 행렬, 대각행렬)을 생성
  • eye(): 대각선인 1인 행렬, identity와 다르게 시작하는 k값의 index를 변경할 수 있음
  • diag(): 대각 행렬의 값만을 추출하는 함수
  • random sampling: 데이터의 분포에 따른 sampling으로 array를 생성
    - np.random.uniform() : 균등분포
    - np.random.noraml() : 정규분포
    - 이 외에도 다양한 분포 종류에 따라서 랜덤값을 만들 수 있음

 

 

Operation Functions

  • Operation Function에는 다양한 종류가 있음! 일반적인 산술 통계는 대부분 가능 (sum(), std(), mean(), sqrt(), exp() 등...)
  • axis: 모든 operation function을 실행할 때 기준이 되는 dimension 축
    • 만약 2차원에서 axis = 0이면, 행 방향으로 작동 ↓ (결과값은 열의 수만큼 나옴)
    • 만약 2차원에서 axis = 1이면, 열 방향으로 작동 → (결과값은 행의 수만큼 나옴)
  • concatenate(): numpy array를 합치는(붙이는) 함수
    • np.vstack(()) : 수직으로 붙이기
    • np.hstack(()) : 수평으로 붙이기
  • 새로운 축을 추가해주고 싶은 경우
    • 방법1: reshape(-1,n)을 하여 형태를 변경
    • 방법2: np.newaixs를 사용하여 값은 그대로 두고 축만 하나 추가하도록 한다
  • ndaraay간 shape가 같을때 같은 위치에 있는 데이터들끼리 기본적인 사칙연산을 지원함 (element-wise operations)
  • dot(): matrix, 즉 기본 행렬간의  곱셈 연산
  • transpose(): 전치행렬을 만드는 함수 (행과 열을 바꾸는 것) (.T 라는 property를 사용해도 좋음)
  • broadcasting: element-wise operation과 다르게, shape가 다른 배열 간 연산을 지원하는 기능

 

🔥 유용한 정보 🔥
- timeit: jupyter notebook 환경에서 코드의 퍼포먼스를 측정하는 함수
- 일반적으로 for loop < list comprehension < numpy 로 속도가 빠름
- 100,000,000번의 loop가 돌 때 약 4배 이상의 성능 차이를 보임

 

 

Comparisons

  • np.all(): 데이터의 전부(and)가 조건에 만족하는지 여부에 따라 T/F 반환
  • np.any(): 데이터의 일부(or)가 조건에 만족하는지 여부에 따라 T/F 반환
  • numpy는 배열의 크기가 동일할 때, element 간 비교의 결과를 bool 타입으로 반환 → 여기에 all/any 사용 가능
  • np.where(): where(condition, TRUE, FALSE) 조건식의 결과에 따라서 참일 경우 TRUE에 위치한 값을 넣고, 거짓일 경우 FALSE에 위치한 값을 삽입
  • np.isnan(): null값일 경우TRUE
  • np.isfinited(): 한없이 커지는 경우를 찾기 위해, 유한한 값일 경우 TRUE 무한한 값일 경우 FALSE
  • np.argmax(), np.argmin(): array내 최대값 또는 최소값의 index를 반환 (axis를 설정할 수도 있음)
  • np.argsort(): 작은 값부터 순서대로 인덱스 값을 반환

 

 

Boolean & Fancy Index

  • Boolean Condition
    • 특정 조건에 따른 값을 배열 형태로 추출
    • Comparision Operation 함수들도 모두 사용 가능
      예) test_array[test_array > 3]
      → 보통 대괄호 안에 들어가는 저 조건식을 condition이라는 변수에 저장해서 사용함
    • Boolean List를 사용 + 원래 리스트와 shape이 동일해야 함

 

  • fancy index
    • numpy는 array를 index value로 사용해서 값 추출 (리스트 내 값을 인덱스 값으로써 사용한다는 의미)
    • take() 함수를 사용하여도 bracket index와 똑같은 효과가 난다!
    • Int List를 사용 + 원래 리스트와 shape가 동일하지 않아도 됨 (하지만 값의 범주가 넘어가면 안됨)

 

 

 Numpy Data I/O

  • np.loadtxt(): 파일 호출
  • astype(): 데이터 타입 변환
  • savetext(): csv 파일로 저장, 구분자(delimiter 지정 가능)

 

 

 

본 포스트는 부트코스 내 네이버 부스트캠프 AI Tech 5기 강의를 토대로 작성되었습니다

 

728x90