넘파이 (Numpy)
- http://www.numpy.org
Numerical Python - 벡터, 행렬 연산을 위한 수치해석용 파이썬 라이브러리
- 강력한 다차원 배열(array) 지원
- 빠른 수치 계산을 위한 structured array, 벡터화 연산, 브로드캐스팅 기법등을 통한 다차원 배열과 행렬연산에 필요한 다양한 함수를 제공한다.
- 파이썬 List 보다 더 많은 데이터를 더 빠르게 처리 - 많은 과학 연산 라이브러리들이 Numpy를 기반으로 한다.
- scipy, matplotlib, pandas, scikit-learn, statsmodels등 - 선형대수, 난수 생성, 푸리에 변환 기능 지원
넘파이에서 데이터 구조
- 스칼라 (Scalar)
- 값 하나.
- 0D Tensor, 0D Array (0차원 배열) - 벡터 (Vector)
- 여러개의 값들을 순서대로 모아놓은 데이터 모음(데이터 레코드)
- 1D Tensor, 1D Array (1차원 배열) - 행렬 (Matrix)
- 벡터들을 모아놓은 데이터 집합. 2개의 방향으로 값들이 관리된다.
- 2D Tensor, 2D Array (2차원 배열) - 텐서 (Tensor)
- 같은 크기의 행렬들(텐서들)을 모아놓은 데이터 집합. N개의 방향으로 값들이 관리된다.
- ND Tensor, ND Array (다차원 배열)
용어
- 축 (axis)
- 값들의 나열 방향
- 하나의 축(axis)는 하나의 범주(분류, Category)이다. - 랭크 (rank)
- 데이터 집합에서 축의 개수.
- 차원 (dimension) 이라고도 한다. - 형태/형상 (shape)
- 각 축(axis) 별 데이터의 개수 - 크기 (size)
- 배열내 원소의 총 개수
넘파이 배열(ndarray)
- Numpy에서 제공하는 N 차원 배열 객체
- 같은 타입의 값들만 가질 수 있다.
- 축(Axis)별 데이터의 개수는 모두 동일하다.
- 빠르고 메모리를 효율적으로 사용하며 벡터 연산과 브로드캐스팅 기능을 제공한다.
차원 (dimension)
- Vector에서 차원: 원소의 개수
- 넘파이 배열에서 차원: 축의 개수
배열 생성 함수
array(배열형태 객체 [, dtype])
- 배열형태 객체가 가진 원소들로 구성된 numpy 배열 생성
- 원하는 값들로 구성된 배열을 만들때 사용한다.
- 다차원(2차원이상) 배열을 만들 경우 각 axis(축)의 size(데이터의 개수)가 동일하도록 한다.
- 배열형태 객체 (array-like)
- 리스트, 튜플, 넘파이배열(ndarray), Series
데이터 타입
- 원소들의 데이터 타입
- ndarray 는 같은 타입의 데이터만 모아서 관리한다.
- 배열 생성시 dtype 속성을 이용해 데이터 타입 설정 가능
- ndarray.dtype 속성을 이용해 조회
- ndarray.astype(데이터타입)
- 데이터타입 변환하는 메소드
- 변환한 새로운 ndarray객체를 반환 - 데이터 타입
- 문자열과 numpy 모듈에서 제공하는 변수를 통해 지정할 수 있다.
1차원 배열 a1
# import -> alias를 np로 지정.
import numpy as np
a1 = np.array([1, 5, 2, 100, 2, 10])
print(type(a1))
print(a1)
a1
2차원 배열 a2
a2 = np.array([[1, 2], [3, 4], [5, 6]])
print(type(a2))
print(a2)
a2
배열 정보 조회 -> dtype, shape, size, ndim
# 배열의 정보 조회
print('배열의 타입:', a1.dtype, a2.dtype)
print('배열의 shape:', a1.shape, a2.shape) # 축별 원소수를 tuple로 반환
print('총원소수:', a1.size, a2.size)
print('차원수(rank):', a1.ndim, a2.ndim) # 배열의 차원수
astype('type') -> 타입 변환
a1.dtype
a1_1 = a1.astype('int64') # 타입을 변환한 새로운 ndarray를 반환.
print(a1_1.dtype, a1.dtype)
float, int 타입이 섞인 array의 타입 -> float
a3 = np.array([1.0, 2, 3, 4]) # float, int. int를 float으로 변환해서 저장 -> 타입을 통일
print(a3.dtype)
a3
dtype = 타입명
- 정수 기본 : int32, 실수 기본 : float64
# a4 = np.array([1, 2, 3, 4, 5], dtype = 'int8')
a4 = np.array([1, 2, 3, 4, 5], dtype = np.int8)
print(a4.dtype)
size -> 값의 개수
print(len(a4), a4.size)
print(a2.size)
len(a2) # 0축의 size
ndarray도 iterable 타입 -> for in
# ndarray도 iterable 타입 -> for in
for i in a1:
print(i)
동일한 값들로 구성된 배열 생성
zeros(shape [, dtype])
영벡터 생성 : 원소들을 0으로 채운 배열
- shape : 형태 지정
- 정수: 1차원일 경우 원소의 개수를 지정
- 튜플: 다차원 배열의 각 축별 size를 설정 - dtype : 데이터타입 지정(생략시 float64)
1차원 배열 영벡터
a5 = np.zeros(shape=10) # 정수 : 1차원배열
print(a5.dtype)
print(a5.shape)
print(a5.ndim)
print(a5.size)
a5
다차원 배열 영벡터
a6 = np.zeros(shape=(3, 4, 5), dtype = 'int32') # tuple : 다차원 배열
print(a6.dtype)
print(a6.shape)
print(a6.ndim)
print(a6.size)
a6
ones(shape [,dtype])
일벡터 생성 : 원소들을 1로 채운 배열을 생성
- shape : 형태 지정
- 정수: 1차원일 경우 원소의 개수를 지정
- 튜플: 다차원 배열의 각 축별 size를 설정 - dtype : 데이터타입 지정(생략시 float64)
2차원 배열 일벡터
a7 = np.ones(shape = (5, 2), dtype = 'int8')
print(a7.dtype)
print(a7.shape)
print(a7.ndim)
print(a7.size)
a7
full(shape, fill_value [, dtype]))
원소들을 원하는 값으로 채운 배열 생성
- shape : 형태 지정
- 정수: 1차원일 경우 원소의 개수를 지정
- 튜플: 다차원 배열의 각 축별 size를 설정 - fill_vlaue : 채울 값
- dtype : 데이터타입 지정(생략시 float64)
2차원 배열
a8 = np.full(shape = (10, 2), fill_value = 10)
print(a8.dtype)
print(a8.shape)
print(a8.ndim)
print(a8.size)
a8
zeros_like(ndarray), ones_like(ndarray), full_like(ndarray, fill_value)
- 매개변수로 받은 배열과 같은 shape의 배열을 생성한다.
매개변수로 삼을 배열 v 생성
v = np.array([[1, 1], [20, 20], [30, 30]])
v.shape
v와 동일한 shape의 0으로 구성된 배열
v1 = np.zeros_like(v)
print(v1.shape)
v1
v와 동일한 shape의 1로 구성된 배열
v2 = np.ones_like(v)
print(v2.shape)
v2
v와 동일한 shape의 100으로(fill_value) 구성된 배열
v3 = np.full_like(v, fill_value = 100)
print(v3.shape)
v3
특정 범위내에서 동일한 간격의 값들로 구성된 배열생성
arange(start, stop, step, dtype)
start에서 stop 범위에서 step의 일정한 간격의 값들로 구성된 배열 리턴. 1차원 배열만 생성할 수 있다.
- start : 범위의 시작값으로 포함된다.(생략가능 - 기본값:0)
- stop : 범위의 끝값으로 포함되지 않는다. (필수)
- step : 간격 (기본값 1)
- dtype : 요소의 타입
- 1차원 배열만 생성가능
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
시작과 끝을 균등하게 나눈 값들을 가지는 배열을 생성
- start : 시작값
- stop : 종료값
- num : 나눌 개수. 기본-50, 양수 여야한다.
- endpoint : stop을 포함시킬 것인지 여부. 기본 True
- retstep : 생성된 배열 샘플과 함께 간격(step)도 리턴할지 여부. True일경우 간격도 리턴(sample, step) => 튜플로 받는다.
- dtype : 데이터 타입
- 1차원 배열만 생성가능
arange
정수
a10 = np.arange(1, 100, 10) # 시작 : 1, 끝 : 100, step(증감) : 10
print(a10)
실수
a11 = np.arange(0, 1, 0.1) # 실수
a11
역순
a12 = np.arange(10, -10, -2)
a12
증감 생략 -> default값 : 1
a13 = np.arange(1, 10) # 시작 : 1, 끝 : 10, step(증감) : 생략 -> 1
a13
시작, 증감 생략
시작 default값 : 0
a14 = np.arange(10) # 시작 : 생략 -> 0, 끝 : 10, step(증감) : 생략 -> 1
a14
linspace
개수 생략 -> default값 : 50
a15 = np.linspace(1, 100) # 시작 : 1, 끝(포함) : 100, 개수 : 생략 -> 50
print(a15.shape)
a15
a16 = np.linspace(1, 100, num = 1000)
print(a16.shape)
a16
endpoint = False -> 끝값 미포함
a17 = np.linspace(1, 100, num = 20, endpoint = False)
print(a16.shape)
a17
retstep = True -> 간격 표시
a18 = np.linspace(1, 100, 30, retstep = True)
print(type(a18)) # (배열, 간격)
print(a18)
a18[1]
linspace 활용
- 그래프를 부드럽게 그리려면 개수가 많이 필요함 -> linspace 활용할 수 있다.
def f(x):
return x**2 + 2*x + 3
X = np.linspace(-10, 10, 1000)
y = f(X) # element-wise 연산
print(X.shape, y.shape)
import matplotlib.pyplot as plt
plt.plot(X, y)
plt.show()
난수(Random value)를 원소로 하는 ndarray 생성
- numpy의 서브패키지인 random 패키지에서 제공하는 함수들을 이용해 생성
import numpy as np
np.random.rand()
np.random.seed(시드값)
- 난수 발생 알고리즘이 사용할 시작값(시드값)을 설정
- 시드값을 설정하면 항상 일정한 순서의 난수(random value)가 발생한다.
랜덤함수는 특정숫자부터 시작하는 일렬의 수열을 만들어 값을 제공하는 함수이다.
시작 숫자는 실행할때 마다 바뀌므로 다른 값들이 나오는데 시드값은 시작값을 고정시키면 항상 시작 값이 같으므로 같은 값들이 순서대로 제공된다.
매번 실행할때 마다 같은 순서의 임의의 값이(난수) 나오도록 할때 시드값을 설정한다.
np.random.seed(0) # 시드값 -> 0
random값이 일정한 규칙을 띄며 제공된다.
np.random.rand()
np.random.rand([axis0, axis1, axis2, ...])
- 0~1사이의 실수를 리턴
- 축의 크기는 순서대로 나열한다.
1차원의 랜덤값 10개를 가진 배열 a1 생성
a1 = np.random.rand(10) # 1차원 : 10개
print(a1.shape)
a1
3차원 배열 생성
a2 = np.random.rand(5, 6, 2) # 3차원 : 축별 size를 나열
print(a2.shape)
a2
# rand() : 0 ~ 1사이 실수 -> 모든값들이 발생할 확률은 동일 -> 균등분포
a3 = np.random.rand(1000)
v, c = np.unique(a3, return_counts=True) # 고유값을 반환, + 개수 (고유값배열, 각 고유값의 개수배열)
plt.bar(v, c)
plt.xlabel('개수')
plt.ylabel('값')
plt.show()
np.random.normal(loc=0.0, scale=1.0, size=None)
정규분포를 따르는 난수.
- loc: 평균
- scale: 표준편차
- loc, scale 생략시 표준정규 분포를 따르는 난수를 제공
정규분포
- 평균: 데이터셋의 값들을 대표하는 값중 하나로 모두 더해서 개수로 나눈 것.
- 정규분포에서 값들이 가장 많이 있을 것이라 생각되는 값이 평균이므로 대푯값으로 사용한다. - 편차: 데이터셋의 각 값들이 평균과 얼마나 차이가 있는지
- 표준편차: 편차의 평균 (평균으로 부터 각 값들이 얼마나 떨어져 있는지에 대한 평균)
- 분산: 표준편차의 제곱으로 표준편차 계산시 나오는 값.
- 분포: 값이 흩어져 있는 상태를 말한다.
- 정규분포
- 연속 확률 분포중 하나. 우리생활에서 가장 많이 나오는 분포중 하나로 종모양을 하고 있으며 평균근처에 가장 많은 값들이 모여 있고 평균으로 부터 표준편차 많큼 멀어질 수록 적게 분포된다.
- 정규분포에서는 1표준편차 범위의 전체 데이터의 68%가 2표준편차 범위에 전체 데이터의 95% 정도가 분포한다. (3표준편차범위에 약 99.7%가 분포) - 표준정규분포
- 평균 : 0, 표준편차 : 1 인 정규 분포 - 정규분포는 평균과 표준편차로 표현한다.
# 70 ~ 90 정도 사이의 몸무게값 1000개
# 평균 : 80, 표준편차 : 5 평균 - 2*표준편차 ~ 평균 + 2*표준편차 범위에 95%정도의 값이 분포되도록 랜덤한 값을 생성.
weights = np.random.normal(loc = 80, scale = 5, size = 1000)
print(weights.shape)
weights
loc, scale 생략
- loc default : 0, scale default : 1
np.random.normal(size = (5, 3)) # 평균 : 0, 표준편차 : 1 -> 표준정규분포.
생성한 정규분포 weights 그래프 그리기
import matplotlib.pyplot as plt
plt.hist(weights, bins = 50)
plt.show()
weights 재정의 및 그래프 그리기
import pandas as pd
weights = np.random.normal(loc = 50, scale = 15, size = 1000)
pd.Series(weights).plot(kind = 'kde')
plt.show()
np.random.randint(low, high=None, size=None, dtype='int32')
임의의 정수를 가지는 배열
- low ~ high 사이의 정수 리턴. high는 포함안됨
- high 생략시 0 ~ low 사이 정수 리턴. low는 포함안됨
- size : 배열의 크기. 다차원은 튜플로 지정 기본 1개
- dtype : 원소의 타입
np.random.randint(10, 20)
# np.random.randint(10, 11)
np.random.randint(10) # 0 ~ 10-1
randint 1차원 배열
b = np.random.randint(10, 20, size = 10)
b.shape
b
randint 3차원 배열
b2 = np.random.randint(10, 20, size = (5, 2, 3))
print(b2.shape)
b2
np.random.choice(a, size=None, replace=True, p=None)
- 샘플링(표본추출) 메소드
- a : 샘플링대상. 1차원 배열 또는 정수 (정수일 경우 0 ~ 정수, 정수 불포함)
- size : 샘플 개수
- replace : True-복원추출(기본), False-비복원추출
- p: 샘플링할 대상 값들이 추출될 확률 지정한 배열
이전에 생성한 배열 b 확인
b, b.shape
복원 추출
# 하나의 값을 여러번 추출할 수 있다. -> 복원 추출
s1 = np.random.choice(b, size = 5) # 배열 b에서 5개의 값을 추출
s1
비복원 추출
s2 = np.random.choice(b, size = 5, replace = False) # 비복원 추출 -> 하나의 값은 한번만 추출.
s2
비복원 추출시에는 추출할 개수와 모집단의 개수가 최소한 같아야 한다.
s3 = np.random.choice([True, False], size = 10
# ,replace = False -> 에러발생, 비복원 추출은 추출할 개수와 모집단의 개수가 최소한 같아야한다
)
s3
2차원 배열
s4 = np.random.choice([True, False], size = (5, 3))
print(s4.shape)
s4
확률 추가
s5 = np.random.choice([True, False], size = 100
,p = [0.9, 0.1] # 각 값이 추출될 확률.
)
print(s5.shape)
s5
np.unique(s5, return_counts = True)[1]/s5.size
'Data_Analysis_Track_33 > Python' 카테고리의 다른 글
| Python_opencv_01(opencv 개요) (1) | 2023.10.05 |
|---|---|
| Python_numpy_02(인덱싱과 슬라이싱을 이용한 배열의 원소 조회 및 변경) (2) | 2023.10.04 |
| Python_matplotlib_05(Seaborn) (0) | 2023.09.22 |
| Python_matplotlib_04(Pandas 시각화) (0) | 2023.09.22 |
| Python_matplotlib_03(각종 그래프 그리기) (0) | 2023.09.21 |