MLOps 부트캠프 by 한경+토스뱅크/Python

Numpy 개념과 특징

나니니 2024. 7. 29. 23:20

Numpy

: 파이썬 라이브러리로써, Numerical Python 의 줄임말로 수치적인 연산에 최적화된 파이썬 도구이다. 

 

Numpy Array

: 자료형, Python List와 유사함, 간결한 코드로 구현, 메모리 및 연산 최적화

장점

  • 루프를 사용하지 않고 대량 데이터의 배열 연산이 가능 -> 빠른 배열 연산 속도
  • C/C++ 등의 저수준 언어 기반 호환 API제공 -> 기존 C/C++ 기반 외부 프로그램과 호환 용이

단점

  • 가독성이 떨어짐
  • 정보에 대한 레이블 삽입 불가
  • 한 가지 데이터 타입만 사용 가능
  • 다양한 API 지원 측면이 어려움

 

import numpy as np # 'as np' 를 약어로 추가하여 모듈을 표현하는 것이 관례

ndarray란?

: 넘파이 기반 데이터 타입이며, ndarry를 이용해 넘파이에서 다차원 배열을 쉽게 생성하고 다양한 연산을 수행할 수 있다.

  • 넘파이 array() 함수: 파이썬의 리스트와 같은 다양한 인자를 입력받아 ndarryay로 변환하는 기능을 수행함
  • 생성된 ndarray 배열의 shape 변수는 ndarray의 크기, 즉 행과 열의 수를 튜플 형태로 가지고 있으며 이를 통해 배열의 차원을 알 수 있음

넘파이의 ndarray 배열의 차원들

np.array() 사용법

ndarray로 변환을 원하는 객체를 인자로 입력하면 ndarray를 반환한다. 

ndarray.shape는 ndarray의 차원과 크기를 튜플(tuple) 형태로 나타내준다. 

ndarray 생성하기 - arange, zeros, ones

  • arange(): 파이썬의 표준 함수인 range()와 유사, array를 range()로 표현함
  • zeros(): 함수 인자, 튜플 형태의 shape 값을 입력하면 모든 값을 0으로 채운 해당 shape을 가진 ndarray를 반환함
  • ones(): 함수 인자, 튜플 형태의 shape 값을 입력하면 모든 값을 1로 채운 해당 shape를 가진 ndarray를 반환함
*함수 인자로 dtype을 정하지 않을 경우, default로 float64 형의 데이터로 ndarray를 채움

차원 및 크기 변경 - reshape()

: reshape() 메서드는 ndarray를 특정 차원 및 크기로 변환함

인덱싱(Indexing)

: 넘파이에서 ndarray 내의 일부 데이터 세트나 특정 데이터만을 선택할 수 있도록 함

 

1. 특정 데이터만 추출

2. 슬라이싱(Slicing): 연속된 인덱스상의 ndarray를 추출, ':'기호로 표현

 

1차원

np.array[0:4] # 0부터 3까지 결과 출력
np.array[:10] # 처음부터 슬라이싱 할 경우, '0'을 입력하지 않아도 됨
np.array[4:] # 4번 인덱스부터 마지막까지 출력
np.array[2:10:3] # 2번 인덱스부터 9번 인덱스까지 3의 간격으로 출력

 

2차원

gdp_array[1:3, 2:] # 1번부터 3번 로우 + 2번 컬럼부터 마지막 컬럼까지
gdp_array[:3, 2:5] # 처음부터 2번까지 로우 + 2번부터 4번까지 컬럼
gdp_array[:, 2:5] # 모든 로우 + 2번부터 4번까지 컬럼

3. 팬시 인덱싱(Fancy Indexing): 일정한 인덱싱 집합을 리스트 또는 ndarray 형태로 지정하여 해당 위치 데이터의 ndarray를 반환함

4. 불린 인덱싱(Boolean Indexing): 특정 조건에 따라 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 해당하는 ndarray를 반환함

gdp_array = np.array([6610, 7637, 8885, 101385, 12565, 13403, 12398, 8282, 10672])
gdp_array > 10000
# 출력: array([Fasle, Fasle, Fasle, Fasle, True, True, True, True, Fasle, True])

mask = gdp_array > 10000
gdp_array[mask]

# 출력: array([10385, 12565, 13403, 12398, 10672])

gdp_array[gdp_array > 10000] # 위 출력값과 동일

gdp_array[(gdp_array > 10000) | (gdp_array < 8000)] # '|'는 or 연산자

gdp_array[(gdp_array <= 10000) & (gdp_array >= 8000)] # '&'는 and 연산자

 


예제1. 

1부터 100까지 숫자가 들어 있는 numbers_array에서 짝수에 해당하는 숫자들만 뽑아보자. 

import numpy as np

numbers_array = np.arrange(1, 101) # arrange: array를 range()로 표현

numbers_array[numbers_array % 2 == 0]

 

  • 평균: .mean()
  • 합: .sum()
  • 최소값: .min()
  • 최대값: .max()
  • array 간 동일한 위치에 있는 인덱스끼리 연산 가능

예제2.

 가격은 price_array, 판매 수량은 quantity_array에 저장되어 있는데요. 치마, 티셔츠, 원피스, 스웨터, 코트, 청바지, 신발 순서대로 정보가 들어 있다고 합니다. 각 상품별 매출액을 한번 계산해보자. 

import numpy as np

price_array = np.array([30000, 25000, 40000, 60000, 95000, 35000, 50000])
quantity_array = np.array([10, 13, 7, 20, 6, 19, 9])

price_array * quantity_array

 

행렬

np.sort()

: 원 행렬은 유지한 채 원 행렬의 정렬된 행렬을 반환

ndarray.sort()

: 행렬 자체를 정렬한 형태로 반환

argsort()

: 정렬 행렬 인덱스를 ndarray 형으로 반환

 

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

행렬 내적

: 행렬 곱, 두 행렬 A와 B의 내적은 np.dot() 을 이용해 계산이 가능하다. (*행렬 개수가 동일해야 함)

A = np.array([[1, 2, 3],
			[4, 5, 6]])
B = np.array([[7, 8],
			[9, 10],
            [11, 12]])
dot_product = np.dot(A, B)
print('행렬 내적 결과:\n', dot_product)

# 출력
행렬 내적 결과:
[[58 64]
[139 154]]

전치 행렬

: 원 행렬에서 행과 열 위치를 교환한 원소로 구성한 행렬이다. 

A = np.array([[1, 2],
				[3, 4]
transpose_mat = np.transpose(A)
print('A의 전치 행렬: \n', transpose_mat)

# 출력
A의 전치 행렬:
[[1 3]
[2 4]]