1. 넘파이란 ?
🥑 NumPy : 배열 데이터를 효과적으로 다루고, 과학 연산을 쉽고 빠르게 할 수 있게 만든 패키지
🥑 파이썬의 기본 데이터 형식과 내장 함수를 이용하는 것보다 다차원 배열 데이터를 효과적으로 처리
🥑 NumPy는 파이썬의 내장 모듈이 아니라서 별도로 설치
import numpy as np
📁 NumPy 홈페이지 : https://numpy.org/
1) 배열 생성
👾 배열 (Array) 이란? 순서가 있는 같은 종류의 데이터가 저장된 집합
👾 NumPy를 이용해 배열을 처리하기 위해서는 우선 NumPy로 배열을 생성해야 함
① 시퀀스 데이터로부터 배열 생성하기 'np. array()'
- 시퀀스 데이터 seq_data를 인자로 받아 NumPy의 배열 객체 array object를 생성
# 정수 리스트로 배열 생성
data1 = [0, 1, 2, 3, 4, 5]
print(data1) # [0, 1, 2, 3, 4, 5]
a1 = np.array(data1)
print(a1) # [0 1 2 3 4 5]
print(a1.dtype) # int64
# 정수와 실수가 혼합된 경우
data2 = [0.1, 5, 4, 12, 0.5]
a2 = np.array(data2)
print(a2) # [ 0.1 5. 4. 12. 0.5]
print(a2.dtype) # float64. 정수와 실수가 혼합돼 있을 때 모두 실수로 변환.
# 숫자와 문자가 있는 경우
data3 = [0.1, 5, 4, 12, 'test']
a3 = np.array(data3)
print(a3) # ['0.1' '5' '4' '12' 'test']
print(a3.dtype) # <U32 -> 길이가 32인 유니코드 문자열
# array()에 직접 리스트를 넣어서 배열 객체도 생성 가능
a3 = np.array([0.5, 2, 0.01, 8])
print(a3) # [0.5 2. 0.01 8. ]
# 다차원 배열의 생성 예
a4 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a4)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
② 범위를 지정해 배열 생성 'np.arange()'
· arange()를 이용해 Numpy 배열을 생성, 파이썬의 range()와 사용방법이 비슷
# 기본 형식
arr_obj = np.arrange([start,] stop[, step])
📌 start부터 시작해서 stop 전까지 step만큼 계속 더해 NumPy 배열을 생성
➡️ start가 0인 경우에는 생략가능
➡️ step이 1인 경우에는 생략가능
a1 = np.arange(0, 10, 2)
print(a1) # [0 2 4 6 8]
a2 = np.arange(1, 10)
print(a2) # [1 2 3 4 5 6 7 8 9]
a3 = np.arange(5)
print(a3) # [0 1 2 3 4]
③ 2차원 배열로 변경 '.reshape(m, n)'
· arrange()를 이용해 생성한 1차원 배열에 reshape(m, n)을 추가하면 m 행 n 열의 2차원 배열(행렬)로 변경
· 주의할 점은 arange()로 생성되는 배열의 원소 개수와 reshape(m, n)의 m * n 의 개수와 같아야 함
a4 = np.arange(12).reshape(4, 3)
print(a4)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
④ 배열의 형태 '.shape'
# NumPy 배열의 형태를 알기 위헤서는 'ndarray.shape'를 실행
print(a4.shape) # (4, 3)
# 1차원 배열의 경우 '(n, )'처럼 표시
print(a1.shape) # (5,)
⑤ 범위의 시작과 끝, 데이터 개수 지정하여 배열 생성 'np.linspace()'
# 기본 형식
arr_obj = np.linspace(start, stop[, num])
# linspace()는 start부터 stop까지 num개의 배열을 같은 간격으로 생성.
# num을 지정하지 않으면 50이 기본값.
a1 = np.linspace(1, 10, 10)
print(a1) # [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
a2 = np.linspace(1, 10, 4)
print(a2) # [ 1. 4. 7. 10.]
# 0부터 파이까지 동일한 간격으로 20개를 나눈 배열 생성
a3 = np.linspace(0, np.pi, 20)
print(a3)
# [0. 0.16534698 0.33069396 0.49604095 0.66138793 0.82673491
# 0.99208189 1.15742887 1.32277585 1.48812284 1.65346982 1.8188168
# 1.98416378 2.14951076 2.31485774 2.48020473 2.64555171 2.81089869
# 2.97624567 3.14159265]
2) 특별한 형태의 배열 생성
👾 모든 원소가 0 혹은 1인 다차원 배열을 만들기 위해서는 'zeros()'와 'ones()'를 이용
a1 = np.zeros(10)
print(a1) # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# 3 * 4의 2차원 배열을 생성
a2 = np.zeros((3, 4))
print(a2)
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
a3 = np.ones(5)
print(a3) # [1. 1. 1. 1. 1.]
3) 배열의 데이터 타입 변환
👾 배열은 숫자뿐만 아니라 문자열도 원소로 가질 수 있음
# 문자열이 원소인 배열 생성 예
a1 = np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
print(a1) # ['1.5' '0.62' '2' '3.14' '3.141592']
print(a1.dtype) # <U8. 데이터 형식이 유니코드이며 문자의 수는 최대 8개라는 의미
4) NumPy 데이터의 형식
b | 불. bool |
i | 기호가 있는 정수. (signed) integer |
u | 기호가 없는 정수. unsigned integer |
f | 실수. floating-point |
c | 복소수. complex-floating point |
M | 날짜. datetime |
O | 파이썬 객체. (Python) objects |
S or a | 바이트 문자열. (byte) string |
U | 유니코드. Unicode |
👾 배열이 문자열(숫자 표시)로 돼 있다면 연산을 위해서는 문자열을 숫자(정수나 실수)로 변환해야 함
👾 형 변환은 astype()로 가능
num_arr = str_arr.astype(dtype)
# 실수가 입력된 문자열을 원소로 갖는 배열을 실수 타입으로 변환하는 예.
str_a1 = np.array(['1.567', '0.123', '5.123', '9', '8'])
num_a1 = str_a1.astype(float)
print(num_a1) # [1.567 0.123 5.123 9. 8. ]
print(str_a1.dtype) # <U5
print(num_a1.dtype) # float64
# 정수를 문자열 원소로 갖는 배열을 정수로 변환하는 예.
str_a2 = np.array(['1', '3', '5', '7', '9'])
num_a2 = str_a2.astype(int)
print(str_a2.dtype) # <U1
print(num_a2) # [1 3 5 7 9]
print(num_a2.dtype) # int64
5) 난수 배열의 생성
👾 rand() 함수를 이용하면 실수 난수를 요소로 갖는 배열을 생성
👾 randint() 함수를 이용하면 정수 난수를 요소로 갖는 배열을 생성
rand_num = np.random.rand([d0, d1, ..., dn])
rand_num = np.random.randint([low,] high [, size])
📌 rand() 함수는 [0, 1) 사이의 실수 난수를 갖는 배열을 생성
▶️ [a, b)의 표현은 배열 크기
📌 randint() 함수는 [low, high) 사이의 정수 난수를 갖는 배열을 생성
▶️ size는 배열의 형태 지정
▶️ low를 입력하지 않으면 0으로 간주
▶️ size를 입력하지 않으면 1로 간주
a1 = np.random.rand(2, 3)
print(a1)
# [[0.4980917 0.8726201 0.73129453]
# [0.0029339 0.16124396 0.4579657 ]]
a2 = np.random.rand()
print(a2) # 0.9081515820816426
a3 = np.random.rand(2, 3, 4)
print(a3)
# [[[0.03399706 0.84441171 0.17392205 0.09881563]
# [0.98804228 0.5106279 0.49711395 0.34850446]
# [0.12695874 0.70715927 0.08024678 0.58860936]]
#
# [[0.02316629 0.75390742 0.09401929 0.56745535]
# [0.10507769 0.53669669 0.35367215 0.1756888 ]
# [0.02745259 0.90007949 0.42169534 0.46447165]]]
a4 = np.random.randint(10, size=(3, 4))
print(a4)
# [[9 9 5 6]
# [3 3 5 5]
# [9 3 5 3]]
a5 = np.random.randint(1, 30)
print(a5) # 23
a6 = np.random.randint(1, 30, 3)
print(a6) # [ 3 19 17]
[ 내용 참고 : IT 학원 강의 ]
'Programming Language > Python' 카테고리의 다른 글
[Python] 판다스(Pandas) | 정의, Series(), np.nan, data_range() 함수, 날짜 및 시간 생성 (0) | 2024.03.12 |
---|---|
[Python] 넘파이(NumPy) | 배열의 연산, 배열의 인덱싱과 슬라이싱 (0) | 2024.03.11 |
[Python] 웹 크롤링 | 이미지 가져오기 및 저장 (0) | 2024.03.10 |
[Python] 웹 크롤링 | BeautifulSoup의 select_one() 과 select(), CSS select 지정 형식 (0) | 2024.03.08 |
[Python] 웹 크롤링 | BeautifulSoup 사용법, find() 와 find_all() (1) | 2024.03.08 |