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의 크기, 즉 행과 열의 수를 튜플 형태로 가지고 있으며 이를 통해 배열의 차원을 알 수 있음
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]]