Data scientist/PYTHON

Python_Numpy

맨사설 2021. 7. 27. 10:14
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가 차지하는 메모리 공간.

 

np.array 함수
2차원 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

 

0은 int가 아닌 float인 것을 확인할 수 있다. 신기신기
이중 괄호인 것 유의

※ 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를 더한다.

 

int에서 float로 바뀐 것을 확인할 수 있다.

※ 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

 

1차원 array indexing
2차원 array indexing

※ 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 정답

 

True에 해당하는 1, 4, 5행 출력한 값
4열이 7행인 masked_data와 shape가 달라 오류가 발생한다.
음수인 값 0으로 치환 방법

※ 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