보리콩 2021. 9. 2. 16:14

NumPy

Numerical Python

Python에서 대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러리

 

데이터를 다루는데 왜 다차원 배열이 필요할까?

데이터의 대부분은 숫자 배열로 볼 수 있다. 

 

Python List?

파이썬 리스트로도 계산 할 수 있지만 numpy는 list에 비해서 빠른 연산을 지원하고 메모리를 효율적으로 사용한다.

 

배열 만들기

list(range(10))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

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.])

 

배열 데이터 타입 dtype

Python List와 다르게 array는 단일타입으로 구성

arr = np.array([1, 2, 3, 4], dtype='float')
arr # array([1., 2., 3., 4.])

arr.dtype
# dtype('float64')

arr.astype(int)
# array([1, 2, 3, 4])

 

 

다양한 배열 만들기

np.zeros(10, dtype=int)
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

np.ones((3, 5), dtype=float)
# array([[1., 1., 1., 1., 1.],
#	[1., 1., 1., 1., 1.],
#    	[1., 1., 1., 1., 1.]])
    
np.arange(0, 20, 2)
# array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

np.linspace(0, 1, 5)
# array([0., 0.25, 0.5, 0.75, 1.])

 

난수로 채워진 배열 만들기

np.random.random((2, 2))
# array([[0.34578932, 0.19582760],
#	[0.45692469, 0.36904247]])

np.random.normal(0, 1, (2, 2))
# array([[ 00.53214346, 0.13478535],
#	[-1.59274924, -0.5432467]])

np.random.randint(0, 10, (2, 2))	# 0~10
# array([[3, 9],
#	[3, 2]])

 

배열의 기초

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: 인덱스로 값을 찾아낸다.

x = np.arange(7)
x[3]		# 3
x[7]		# IndexError: index 7 is out of bounds
x[0] = 10	# array([10, 1, 2, 3, 4, 5, 6])

 

 

Slicing: 인덱스 값으로 배열의 부분을 가져오는 것

x = np.arange(7)
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])   2씩 건너뛰면서

 

2차원 배열의 슬라이싱

# Q6. matrix의 (2,3) 인덱스의 요소를 출력해보세요.
print(matrix[2, 3])

# Q7. matrix의 행은 인덱스 0부터 인덱스 1까지, 열은 인덱스 1부터 인덱스 3까지 출력해보세요.
print(matrix[0:2, 1:4])

 

 

 

reshape: array의 shape를 변경한다.

x = np.arrange(8)
x.shape	#(8,)

x2 = x.reshape(2, 4)
# array([[0, 1, 2, 3],
#	[4, 5, 6, 7]])
x.shape	#(2, 4)

 

 

concatenate: array를 이어 붙인다.

x = np.array([0, 1, 2])
y = np.array([3, 4, 5])

np.concatensate([x, y])
# array([0, 1, 2, 3, 4, 5])

 

 

np.concatenate: axis 축을 기준으로 이어붙일 수 있다.

matrix = np.arange(4).reshape(2, 2)
np.concatenate([matrix, matrix], axis=0)	# axis=0: 세로
np.concatenate([matrix, matrix], axis=1)	# axis=1: 가로

 

 

np.split: axis 축을 기준으로 나눌 수 있다.

matrix = np.arange(16).reshape(4, 4)
upper, lower = np.split(matrix, [3], axis=0)	# 세로 방향에서 index 3을 기준으로
upper, lower = np.split(matrix, [3], axis=1)	# 가로 방향에서 index 3을 기준으로

 

 

numpy 연산

루프는 느리다.

array의 모든 원소에 5를 더해서 만드는 함수 => for문으로 모든 원소에 5를 더하면 속도가 느려짐

 

기본 연산

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 + np.array([1, 2, 3])	# [1, 2, 3]을 3x3 행렬로 늘려서 더함
np.arange(3).reshape((3, 1)) + np.arange(3)	# 3x1 + 1x3

배열을 잡아서 늘렸을 때 같은 크기로 만들 수 있다면 연산 가능

 

 

 

집계함수

집계: 데이터에 대한 요약 통계를 볼 수 있다.

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)	#표준편차
x = np.arange(8).reshape((2, 4))
# array([[0, 1, 2, 3],
#	[4, 5, 6, 7]])

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])
import numpy as np

daily_liar_data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0]
matrix = np.array(daily_liar_data)

# 양치기 소년이 거짓말을 몇 번 했는지 구하여 출력해주세요.
print(len(matrix[matrix<1]))
print(np.count_nonzero(matrix == 0))

 

 

 

 

 

 

 

 

 

 

 

 

[출처: 앨리스AI트랙 2기 aitrack.elice.io]