NumPy
Updated:
-
데이터를 배열로 보는 방법
-
numpy는 list에 비해서 빠른 연산을 지원하고 메모리를 효율적으로 사용한다.
-
리스트의 초기화
list(range(10))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numpy 초기화
import numpy as np
np.array([1, 2, 3, 4, 5])
# array([1, 2, 3, 4, 5])
- 리스트로부터 배열 만들기
np.array([1, 2, 3, 4, 5])
# array([1, 2, 3, 4, 5])
np.array([3, 1.4, 2,3, 4])
# array([3., 1.4, 2., 3., 4.])
# 하나라도 실수라면 모두 실수로 만든다
np.array([[1, 2],
[3, 4]])
# array([[1, 2],
# [3, 4]])
np.array([1, 2, 3, 4],dtype='float')
# array([1., 2., 3., 4.])
np.arange(7)
# array([0, 1, 2, 3, 4, 5, 6])
np.empty(5)
# 빈 배열을 만들어 준다
배열 데이터 타입 dtype
- Python List와 다르게 array는 단일타입으로 구선된다
arr = np.array([1, 2, 3, 4], dtype=float)
arr
# array(1., 2., 3., 4.])
arr.dtype
# dtype('float64')
.astype()
- 타입을 바꾸어 준다
arr.astype(int)
# array([1, 2, 3, 4])
dtype | 설명 | 다양한 표현 |
---|---|---|
int | 정수형 타입 | i, int_, int32, int64, i8 |
float | 실수형 타입 | f, float_, float32, float64, f8 |
str | 문자열 타입 | str, U, U32 |
bool | 부울 타입 | ?, bool_ |
다양한 배열 만들기
np.zeros(10, dtype=int)
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# 10*1 행렬로 0을 int 타입으로 만들어 준다
np.ones((3,5), dtype=float)
# array([1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.]])
# 3*5 행렬로 1을 float 타입으로 만들어 준다
np.arange(0, 20, 2)
# array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
# 0부터 20까지 2씩 더해 가면서 만들어 준다
np.linspace(0, 1, 5)
# array([0., 0.25, 0.5, 0.75, 1.])
# 0부터 1까지 5개로 같은 간격으로 나누어 만들어 준다
난수로 채워진 배열 만들기
np.random.random((2,2))
# array([[0.31231231, 0.5235842],
# [[0.34565656, 0.1235673]])
# 인자로 튜플을 받아 shape를 만든다
np.random.normal(0,1,(2,2))
# array([[0.31231231, 0.5235842],
# [[-0.34565656, -0.1235673]])
# 평균이 0이고 표준 편차가 1인 값을 2*2행렬로 만든다
np.random.randint(0,10,(2,2))
# array([[3, 9],
# [[3, 2]])
# 0 ~ 10 의 int 값을 랜덤으로 하여 만들어 준다
배열의 기초
x2 = np.random.randint(10, size=(3, 4))
# array([[2, 2, 9, 0],
# [4, 2, 1, 0],
# [1, 8, 7, 3]])
x2.ndim # 2
# 배열의 차원
x2.shape # (3, 4)
# 배열의 모양
x2.size # 12
# 배열의 원소 수
x2.dtype # dtype('int64')
# 배열릐 데이터 타입
Indexing
- Indexing: 인덱스로 값을 찾아낸다
x = np.arange(7)
# array([0, 1, 2, 3, 4, 5, 6])
x[3]
# 3
x[7]
# IndexError: index 7 is out of bounds
x[0] = 10
# array([10, 1, 2, 3, 4, 5, 6])
- Slicing: 인덱스 값으로 배열의 부분을 가져오는 것
- list와 사용법이 같다
x = np.arange(7)
# array([0, 1, 2, 3, 4, 5, 6])
x[1:4]
# array([1, 2, 3])
x[1:]
# array([1, 2, 3, 4, 5, 6)]
x[:4]
# array([0, 1, 2, 3])
x[::2]
# array([0, 2, 4, 6])
# index를 2씩 건너뛰면서 가져온다
모양 바꾸기
reshape
- reshape:array의 shape를 변경한다
x = np.arange(8)
x.shape
# (8,)
x2 = x.reshape((2,4))
# array([[0, 1, 2, 3],
# [4, 5, 6, 7]])
x2.shape
# (2, 4)
이어 붙이고 나누고
- concatenate: array를 이어 붙인다
x = np.array([0, 1, 2])
y = np.array([3, 4, 5])
np.concatenate([x, y])
# array([0, 1, 2, 3, 4, 5])
concatenate
- np.concatenate:axis 축을 기준으로 이어붙일 수 있다
matrix = np.arange(4),reshape(2,2)
# array([0, 1],
# [2, 3])
np.concatenate([matrix, matrix], axis=0)
# array([0, 1],
# [2, 3],
# [0, 1],
# [3, 4])
# axis=0은 세로방향
matrix = np.arange(4),reshape(2,2)
# array([0, 1],
# [2, 3])
np.concatenate([matrix, matrix], axis=1)
# array([0, 1, 0, 1],
# [2, 3, 2, 3])
# axis=1은 가로방향
split
-
np.split:axis 축을 기준으로 나눌 수 있다
-
세로로 나누기
matrix = np.arange(16).reshape(4, 4)
# array([0, 1, 2, 3],
# [4, 5, 6, 7],
# [8, 9, 10, 11],
# [12, 13, 14, 15])
upper, lower = np.split(matrix, [3], axis=0)
# upper
# array([0, 1, 2, 3],
# [4, 5, 6, 7],
# [8, 9, 10, 11])
# lower
# array([12, 13, 14, 15])
- 가로로 나누기
matrix = np.arange(16).reshape(4, 4)
# array([0, 1, 2, 3],
# [4, 5, 6, 7],
# [8, 9, 10, 11],
# [12, 13, 14, 15])
upper, lower = np.split(matrix, [3], axis=1)
# upper
# array([0, 1, 2],
# [4, 5, 6],
# [8, 9, 10],
# [12, 13, 14)
# lower
# array([3],
# [7],
# [11],
# [15])
numpy 연산
- 시간 복잡도 비교
- 루프와 비교해서 빠르다
def add_five_to_array(values):
output = np.empty(len(values))
for i in range(len(values)):
output[i] = values[i] + 5
return output
values = np.random.randint(1, 10, size=5)
add_five_to_array(values)
big_array = np.random.randint(1, 100, size = 10000000)
add_five_to_array(big_array)
# 5.3 s의 시간이 걸린다
# ====================================================
big_array + 5
# 33.5 ms의 시간이 걸린다
- array는 +,-,*,/ 에대한 기본 연산을 지원한다
x = np.arange(4)
# array([0, 1, 2, 3])
x + 5
# array([5 ,6 ,7 ,8])
x - 5
# array([-5, -4, -3, -2])
x * 5
# array([0, 5, 10, 15])
x / 5
# array([0. , 0.2, 0.4, 0.6])
- 다차원 행렬에서도 적용가능하다
x = np.arange(4).reshape((2, 2))
y = np.random.randint(10, size=(2, 2))
x + y
# array([[1, 7],
[6, 5]])
x - y
# array([[-1, -5],
# [-2, 1]])
Broadcasting
- shape이 다른 array끼리 연산
# matrix + 5
|2|4|2| + |5|
|6|5|9|
|9|4|7|
= |7 |9 |7 |
|11|10|14|
|14|9 |12|
# matrix = np.array([1, 2, 3])
|2|4|2| + |1|2|3|
|6|5|9|
|9|4|7|
= |3 |6 |5 |
|7 |7 |12|
|10|6 |10|
# np.arange(3).reshape((3,1)) + np.arange(3)
|0| + |0|1|2|
|1|
|2|
= |0|1|2|
|1|2|3|
|2|3|4|
집계함수
- 집계: 데이터에 대한 요약 통계를 본 수 있다
x = np.arange(8).reshape((2,4))
np.sum(x)
# 28
np.min(x)
# 0
np.max(x)
# 7
np.mean(x)
# 3.5
np.std(x)
# 2.29128784747792
- 축을 사용해서 집계
x = np.arange(8).reshape((2,4))
np.sum(x, axis=0)
# array([4, 6, 8, 10])
np.sum(x, axis=1)
# array([6, 22])
마스킹 연산
- True, False array를 통해서 특정 값들을 뽑아내는 방법
x = np.arange(5)
# array([0, 1, 2, 3, 4])
x < 3
# array([True, True, True, False, False])
x > 5
# array([False, False, False, False, False])
x[x < 3]
# array([0, 1, 2])
Leave a comment