티스토리 뷰

개발공부/🎅 Python

[Python] NumPy 사용해보기

2022. 9. 24. 12:30

1️⃣  NumPy 소개

 

NumPy (Numerical Python)

 

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

 

-  Numpy 라이브러리는 효율적인 데이터분석이 가능하도록 N차원의 배열 객체를 지원한다.

-  Numpy의 배열은 파이썬의 list()보다도 빠른 연산과 효율적인 메모리 사용이 가능하기 때문에 빅데이터 분석 등에 널리쓰인다.

 

 

 

 

왜 다차원 배열을 다루는가?  -  NumPy를 사용하는 이유

 

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

 

ex) 

흑백이미지는 해당 픽셀에 대한 명암을 나타내는 2차원 배열 데이터로 나타낼 수 있다.

사운드 데이터는 시간 대비 음악을 나타내는 1차원 배열로 볼 수 있다.

 

이미지출처 : 엘리스 파이썬으로 시작하는 데이터 분석 - NumPy 사용해보기 강의자료

 

 

2)  파이썬 리스트에 비해, 빠른 연산을 지원하고 메모리를 효율적으로 사용할 수 있다.

 

 

 

 

 

2️⃣  배열 (Array)

 

1)  배열 생성

np.array()
import numpy as np

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

 

 

 

 

2)  배열 데이터 타입 dtype

 

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

 

dtype 설명 다양한 표현
int 정수형 타입 i, int_, int32, int64, i8
float 실수형 타입 f, float_, float32, float64, f8
str 문자열 타입 str, U, U32
bool 부울 타입 ?, bool_

 

 

-  배열의 데이터 타입 확인

array.dtype

 

-   배열의 데이터 타입 수정

array.astype(타입)

 

ex)

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

# array의 데이터 타입 확인
arr.dtype
# dtype('float64')

# array의 데이터 타입 바꾸기
arr.astype(int)
# array([1, 2, 3, 4])

 

 

 

 

3) 다양한 배열 만들기

 

-  np.zeros(데이터 형태, dtype=타입)  :  0이 들어있는 배열 생성

-  np.ones(데이터 형태, dtype=타입)  :  1이 들어있는 배열 생성

-  np.arange(시작값, 끝값, 간격)  :  배열 버전의 range 함수

-  np.linspace(시작값, 끝값, 갯수) 

-  np.empty(데이터 형태, dtype=타입)  :  초기화가 없는 값으로 배열을 반환

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.arange(1, 16).reshape(3,5)
# array([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15])

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

 

 

 

 

4)  난수로 채워진 배열 만들기

 

-  random.random(데이터 형태)

-  random.normal(평균, 표준편차, 데이터 형태)  :  표준정규분포로 데이터 추출

-  random.randint(시작값, 끝값, 데이터 형태)  

np.random.random((2, 2))
# array([[0.30986539, 0.85863508],
#	[0.89151021, 0.19304196]])

np.random.normal(0, 1, (2, 2))
# array([[ 0.44050683, 0.04912487],
#	[-1.67023947, -0.70982067]])

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

 

예시)

# 0이상 10 미만의 랜덤한 값이 들어있는 2*4크기의 배열

np.random.randint(0,10,(2,4))

 

 

 

 

5)  배열의 기초

 

ndim,  shape,  size,  dtype

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') : 타입

 

 

 

6)  Indexing

 

: 인덱스로 값을 찾아내는 것

# [0, 1, 2, 3, 4, 5, 6]
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])

 

 

 

 

 

7)  Slicing

 

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

# [0, 1, 2, 3, 4, 5, 6]
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차원 배열

#1부터 15까지 들어있는 (3,5)짜리 배열
matrix = np.arange(1, 16).reshape(3,5)

# 행은 인덱스 0부터 인덱스 1까지, 열은 인덱스 1부터 인덱스 3까지
matrix[0:2,1:4]

 

 

 

 

 

8)  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)

 

 

 

 

 

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

 

예시) 

matrix = np.arange(4).reshape(2, 2)
# [0 1
#  2 3]

# 세로 방향으로 이어붙이기
np.concatenate([matrix, matrix], axis=0)
# [0 1
#  2 3
#  0 1
#  2 3]


# 가로 방향로 이어붙이기
np.concatenate([matrix, matrix], axis=1)
# [0 1 0 1
#  2 3 2 3]

 

 

 

 

 

10)  split

 

: axis 축을 기준으로 분할한다.

 

matrix = np.arange(16).reshape(4, 4)

upper, lower = np.split(matrix, [3], axis=0)

이미지출처 : 엘리스 파이썬으로 시작하는 데이터 분석 - NumPy 사용해보기 강의자료

 

 

matrix = np.arange(16).reshape(4, 4)

left, right = np.split(matrix, [3], axis=1)

이미지출처 : 엘리스 파이썬으로 시작하는 데이터 분석 - NumPy 사용해보기 강의자료

 

 

 

 

 

3️⃣  numpy 연산

 

루프는 느리다

 

간단한 데이터에 대해서는 문제없이 수행 가능하나 만약 array의 크기가 크다면?

def add_five_to_array(values):
    output = np.empty(len(values))
    for i in range(len(values)):
        output[i] = values[i] + 5
    return output


# 크기가 큰 array
big_array = np.random.randint(1, 100, size=10000000)

 

for문을 통해 연산  →  처리시간  :  5.3 s

add_five_to_array(big_array)
# 5.3 s ± 286 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)

 

numpy 연산  →  처리시간  :  33.5 ms

big_array + 5
# 33.5 ms ± 1.94 ms per loop (mean ± std. dev. of 7 runs, 5 loops each)

 

NumPy는 이런 연산을 미리 컴파일된 루틴으로 만들어놓아서 매우 빠른 속도로 실행이 가능하다.

 

 

 

 

 

 

1)  기본 연산 (universal function)

 

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))
# [ 0 1    [1 6
#  2 3]     4 2]

x + y
# array([[1, 7],
#	[6, 5]])

x - y
# array([[-1, -5],
#	[-2, 1]])

 

 

 

 

 

2)  브로드캐스팅 (Broadcasting)

 

:  shape이 다른 array끼리 연산

 

 

예시1)

 

이미지출처 : 엘리스 파이썬으로 시작하는 데이터 분석 - NumPy 사용해보기 강의자료

 

 

 

예시2)

 

이미지출처 : 엘리스 파이썬으로 시작하는 데이터 분석 - NumPy 사용해보기 강의자료

 

 

 

예시3)

 

이미지출처 : 엘리스 파이썬으로 시작하는 데이터 분석 - NumPy 사용해보기 강의자료

 

 

 

 

 

 

4️⃣  집계함수 & 마스킹 연산

 

집계함수

 

집계  :  데이터에 대한 요약 통계

 

x = np.arange(8).reshape((2, 4))
# [ 0 1 2 3
#   4 5 6 7]

np.sum(x)	# 28 (합계)
np.min(x)	# 0 (최솟값)
np.max(x)	# 7 (최댓값)
np.mean(x)	# 3.5 (평균값)
np.std(x)	# 2.29128784747792 (표준편차)

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

 

 

반응형
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그