728x90
◎ Python_Numpy
- 넘파이(Numpy)는 Python에서 벡터, 행렬 등 수치 연산을 수행하는 선형대수(Linear algebra) 라이브러리입니다.
- python list와 비슷한 개념을 numpy에서는 numpy array라고 부른다.
- 파이썬 리스트처럼 여러 데이터를 한 번에 다룰 수 있으나, 모든 데이터가 동일한 data type을 가져야 합니다.
※ Numpy의 특징
- numpy array는 만들어지고 나면 원소의 update는 가능하지만, array의 크기를 변경할 수는 없다.
- 사실 numpy array는 C, C++로 구현이 되어 있다. 이는 high performance를 내기 위해서이며, python이 Numerical computing에 취약하다는 단점을 보완한다.
- numpy array는 universal function(through broadcast)를 제공하기 때문에 같은 연산 반복에 대해 훨씬 빠르다. 데이터의 크기가 클수록 차이가 더 크다.
§ 백문이 불여일견이라
import numpy as np # numpy 라이브러리를 불러옵니다.
np.array((1,2,3,4,5)) # array 함수 생성
############## 2차원 array 함수 생성 ###################
data2=[[1,2,3],[4,5,6],[7,8,9]]
arr2 = np.array(data2)
arr2, type(arr2)
########################################################
######## array함수 특징 파악 코드 ######################
print("arr2의 차원 : ", arr2.ndim) # arr2의 차원
print("arr2의 shape : ", arr2.shape) # arr2의 행, 열의 크기
print("arr2의 size : ", arr2.size) # arr2의 행 x 열
print("arr2의 dtype : ", arr2.dtype) # arr2의 원소의 타입. int64 : integer + 64bits
print("arr2의 itemsize : ", arr2.itemsize) # arr2의 원소의 사이즈(bytes) 64bits = 8B
print("arr2의 nbytes : ", arr2.nbytes) # nbytes = itemsize * size ,numpy array가 차지하는 메모리 공간.
# array 초기 생성 방법
np.zeros(5) # 0이 5개 있는 array
np.zeros((3,3)) # 0이 3X3인 array
np.ones(3) # 1이 3개 있는 array
np.arange(10) # 0부터 9까지 숫자를 자동으로 생성한 array
※ Array Operation
- numpy array를 쓰는 가장 큰 이유는 vector처럼 사용할 수 있기 때문입니다.
- 데이터 분석은 99.9% 데이터를 벡터로 표현하여 분석하기 때문에, 이 특징은 굉장히 중요합니다.
# v1 = (1, 2, 3), v2 = (4, 5, 6) 벡터 2개 생성하기.
v1 = np.array((1,2,3))
v2 = np.array((4,5,6))
# vector addition
v1+v2 # shape가 같아야지 더하기가 된다.
# vector subtraction
v1-v2
# (not vector operation) elementwise multiplication
v1*v2
# (not vector operation) elementwise division
v1/v2
# dot product / 내적 구하는 방법
v1@v2 # method 1
np.inner(v1,v2) # method 2
※ Universal Functions
- numpy array는 하나의 함수를 모든 원소에 자동으로 적용해주는 Universal Function이라는 기능을 제공한다.
arr1 = np.array([1, 2, 3])
arr1 / 1 # float 만드는 방법
1 / arr1 # 모든 원소를 역수 취한다.
arr1 + 2 # 모든 원소에 2를 더한다.
※ Numpy Indexing
arr1 = np.arange(10) # 0부터 9까지 array 생성
arr1[0] # 첫번째 원소
arr1[-1] # 마지막 원소
arr1[:3] # 앞에서부터 원소 3개 slicing
# 2차원으로 확장
arr2 = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
arr2[1][2] # arr2의 2행 3열 원소 = 7
arr2[1,2] == arr2[1][2]
arr2[:,2] # 모든 row에 대해서 3번째 원소를 indexing
arr2[1,:] # arr2의 두번째 row
※ Masking
mask = np.array([1, 0, 0, 1, 1, 0, 0])
data = np.random.randn(7, 4) # 표준정규분포에서 random sampling을 한 원소를 가지는 7x4 행렬을 만든다.
# randn() = Return a sample (or samples) from the "standard normal" distribution.
# mask 만들기
masked_data = (mask == 1) # boolean arry (boolean mask) :True False로 이루어진 것
masked_data
# 위에서 생성한 data에 mask를 적용해본다.
data[masked_data,:] # True에 해당하는 모든 행값 출력
data[masked_data]==data[masked_data,:]
# fancy indexing을 이용해서 masking
data[:,0]<0 # 1열에서 음수인 값은 True인 7 X 1의 mask 생성
data[data[:,0]<0,0] # 1열에서 음수인 값 반환
data[data[:,0]<0,0]=0 # 1열에서 0보다 작은 원소를 0으로 치환
# Qize1 : data에 2번째 column에 있는 원소가 0보다 큰 모든 Row를 출력하세요.
print(data[data[:,1]>0]) # Qiz1 정답
# Qize2 : data에 2번째 column에 있는 원소 중에 0보다 큰 원소들을 출력하세요.
data[data[:,1]>0,1] # Qiz2 정답
※ Numpy Methods
mat1 = np.random.rand(3,3) # 0~1의 값 random sampling을 한 원소를 가지는 3x3 행렬을 만든다.
# randn와 rand는 다르다!!
np.abs(mat1) # mat1에 절대값 씌우기
np.sqrt(mat1) # mat1의 square root(제곱근) 구하기
np.square(mat1) # mat1 제곱하기
np.exp(mat1) # mat1의 지수값 구하기
np.log(mat1) # mat1의 log값(자연로그) 구하기
np.log10(mat1) # mat1의 상용로그
np.sign(mat1) # 부호찾기
np.ceil(mat1) # 올림
np.floor(mat1) # 내림
np.isnan(mat1) # 존재하지 않는 값이 있는지 없는지 nan = not a number
np.maximum(mat1, mat2) # mat1과 mat2에 존하는 값 중 큰 값만 선택 / shape가 같아야 한다!!
※ Reshaping array
x1=np.arange(1,10).reshape(3,3) # 3x3 행렬로 변형합니다.
x2=np.array([1,2,3]).reshape(3,1) # 3X1 행렬로 변형합니다.
# reshape(-1,1)을 사용해도 같은 결과 출력
# Concatenation of arrays
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# stacking horizontally (가로로 합치기)
np.concatenate([arr1,arr2]) # method 1
np.append(arr1,arr2) # method 2
np.hstack([arr1,arr2]) # method 3
# stacking vertically (세로로 합치기)
np.vstack([arr1,arr2])
※ Aggregation functions (집합 함수)
np.sum(mat1) # 모든 원소의 총합
np.sum(mat1,axis=0) # columne별 합
np.sum(mat1, axis=1) # row별 합
np.mean(mat1) # 평균
np.mean(mat1, axis=0) # columne별 평균
np.std(mat1) # 모든 원소의 표준편차
np.min(mat1, axis=0) # columne별 최솟값
np.max(mat1, axis=1) # row별 최댓값
np.argmin(mat1, axis=0) # columne별 최소값이 있는 곳의 Index
np.cumsum(mat1) # 모든 원소의 누적합
np.sort(mat1) # 오름차순 정렬
np.argsort(mat1, axis=0) # argument sorting에서 정렬된 값의 원래 위치를 보여줍니다.
# 정렬된 다음의 index를 원래 원소의 위치에 표시해줍니다.
728x90
'Data scientist > PYTHON' 카테고리의 다른 글
Python_Seaborn (0) | 2021.07.29 |
---|---|
Python_Pandas (0) | 2021.07.28 |
Python_데이터 입출력(IO) (0) | 2021.07.23 |
Python_function() (0) | 2021.07.22 |
Python_data type()_2 (0) | 2021.07.21 |