본문 바로가기
Python/Data Analysis

Numpy

by emilia park 2023. 5. 14.
728x90

Numpy(Numerical Python) :

- C/ C++/ 포트란 등의 언어와 통합 가능

- 고성능 수치계산에 특화된 라이브러리

- 벡터 및 행렬 연산에 있어서 굉장히 편리한 기능을 제공

- pandas 와 matplotlib 의 기반이 되는 data handling 모듈

- 리스트에 비해 빠르고 메모리 효율적

- 반복문 없이 데이터 배열에 대한 처리를 지원

- 선형대수와 관련된 다양한 기능 제공

 

*파이썬은 interpreter 언어이기 때문에 처리 속도에 문제가 있는데 이를 보완할 수 있는 모듈

 

 

1. numpy 불러오기 

import numpy as np

보통은 numpy 를 np 라는 명칭(alias) 으로 불러옴

 

 

2. np.array : 배열을 행렬로

#np.array

x = [1,2,3,4]
y = np.array(x)

print(y) 

##출력 
#array([1, 2, 3, 4])
#numpy type 
type(y) 	# 출력 : numpy.ndarray
#vector
vector = [1,2,3,4,5]
np.array(vector)


#matrix 
matrix = [[1,2,3,4],[1,2,3,4],[1,2,3,4]]
np.array(matrix)


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

np.array([[1,2,3],[4.5,5,6]], dtype = int ) 
np.array([[1,2,3],[4.5,"5","6"]], dtype = np.float32)
#size : shape의 모든 값 곲
np.array(tensor,int).size
#ndim 
np.array(tensor,int).ndim 	#출력 : 3

 

*shape : numpy array 의 dimension 구성을 '튜플' 형태로 반환

*ndim : number of dimension (1 :  vector, 2 : matrix, 3 : tensor)

*size : number of data (shape 모든 곱)

*dtype : numpy array의 데이터 타입 설정

 

 

 

 

3. Handling Shape : reshape/ flatten

#reshape
test_matrix  = [[1,2,3,4],[5,6,7,8]]
np.array(test_matrix).shape 			# (2, 4) 
np.array(test_matrix).reshape(8,) 		# (8, 1) 
np.array(test_matrix).reshape(-1,4) 	# (2, 4) 
np.array(test_matrix).reshape(-1,2) 	# (4, 2) 
np.array(test_matrix).reshape(2,2,2) 	# (2, 2, 2)
#faltten 
test_matrix = [[[1,2,3,4],[1,2,5,8]],[[1,2,3,4],[1,2,4,6]]]
np.array(test_matrix).flatten() 	# (16, )

*reshape 에서 -1의 의미 : 원래 shape의 길이와 결정된 reshape 차원가지고 나머지 차원 추정하여 결정

 

 

4. indexing and slicing (1dim & 2dim)

indexing :  앞은 row, 뒤는 column 을 의미 

slicing : 리스트와 달리 행, 열을 나눠서 슬라이싱 가능, matrix에서 부분집합 추출시 유용

[start, end+1, step]

# 1-dimension array index and slice 

y[1] 	#두 번째 성분
y[1:] 	#두 번째 성분부터 끝까지 
y[:2] 	#처음부터 두 번째 성분까지 
y[-1] 	#맨 마지막 성분
y[:-1] 	#맨 마지막에서 두 번째 성분까지
# 2-dimension array index and slice 

y2[:,:] 	#행렬 전체 
y2[0, 1:3] 	#첫 행, 두 번째에서 세 번째 열
#argmax : max index
a = np.array([1,2,3,4,5,6,6,4,4,3])
np.argmax(a) 	#5

#argmin : mimn index
a = np.array([1,2,3,4,5,6,6,4,4,3])
np.argmin(a)	#0

*argmin, argmax : min/max index 

 

 

 

 

 

 

5. creation array : linspace(start, end, count), arange(n) 

#linspace 수열 생성 

np.linspace(0,10,101)

0부터 10까지 101개의 데이터 생성

#arange(n) : n개의 숫자 배열 생성 

np.arange(30).reshape(5,6)

30까지의 배열을 (5, 6) shape 으로 형성 

 

 

 

 

 

6. creation function : empty, something _like, identity, eye, diagonal

#empty 
np.empty(shape = (10,), dtype = int) #shape 에 맞는 아무 행렬 형성


#something_like
test_matrix = np.arange(100).reshape(5,-1)	#기준 matrix

np.ones_like(test_matrix) 					#위 shape 에 맞는 ones matrix 
np.zeros_like(test_matrix) 					#위 shape 에 맞는 zeros matrix
np.empty_like(test_matrix, dtype = float)	#위 shape 에 맞는 empty matrix


#identity 
np.identity(n = 3, dtype = int) 	#(n, n) shape 


#eye(N, M, k)
#N : 행 사이즈
#M : 열 사이즈 
#k : 1이 시작되는 column index
np.eye(N = 3, M = 5, dtype = int) 	#(N, M) shape 
np.eye(N = 3, M = 5, k =2, dtype = int)



#diagonal : 대각성분
matrix = np.arange(9).reshape(3,3)
np.diag(matrix) 	
np.diag(matrix, k = 2)

 

 

7. random sampling : random.uniform, random.normal

#uniform 
np.random.uniform(0,1,10).reshape(2,5) 


#normal : loc = 0.0, scale = 1.0, size = None
np.random.normal(0,1,10).reshape(2,5)

uniform
normal

 

 


8. array calculation1  : summation, mean, std, min, max

#multi dimension array 
y2 = np.array([[1,2,3,4], [5,6,7,8]])
print(y2.shape) 		#2*4 size

y3 = np.array([[1,2],[3,4]])
print(y3.shape) 		#2*2 size
#summation and mean 

np.sum(y2) 				#all summation 
np.sum(y2, axis = 0) 	#column summation 
np.sum(y2, axis = 1) 	#index summation 

np.mean(y2) 			#all mean 
np.mean(y2, axis = 0) 	#column mean 
np.mean(y2, axis = 1) 	#index mean

np.std(y2) 				#all std
np.std(y2, axis = 0) 	#column std 
np.std(y2, axis = 1) 	#index std

np.max(y2) 				#maximum
np.min(y2) 				#minimum

*axis

[2-dimension]

axis = 0 : column

axis = 1 : index

 

[3-dimension]

axis = 0 : layer

axis = 1 : index

axis = 2 : column 

numpy axis 이해

 

 

 

 

 

 

9. array calculation2 : exponential, squart, h/vstack, concatenate

#exponential : 각 성분 모두 exponential
test_array = np.arange(1,13).reshape(3,4) 
np.exp(test_array) 

#squart : 각 성분 모두 제곱근
test_array = np.arange(1,13).reshape(3,4) 
np.sqrt(test_array)
#hstack : horizontal stack 
a = np.array([1,2,3])
b = np.array([2,3,4])
np.hstack((a,b))

#vstack : vertical stack 
a = np.array([1,2,3])
b = np.array([2,3,4])
np.vstack((a,b))
#concatenate 
a = np.array([[1],[2],[3]])
b = np.array([[2],[3],[4]])

np.concatenate((a,b),axis = 0) #hstack 
np.concatenate((a,b),axis = 1) #vstack

 

 

 

10. array calculation3 : dot_product, transpose, etc. 

#dot_product
test_a = np.arange(1,7).reshape(2,3)
test_b = np.arange(7,13).reshape(3,2)
test_a, test_b

#or 
test_a.dot(test_b) #(2,3)*(3,2)

#or
test_a@test_b

#or 
np.matmul(test_a, test_b)
#transpose 
a = np.arange(1,7).reshape(2,3) 
a.transpose()
a.T

 

 

 

11. scalar-vector-matrix calculation 

#matrix and scalar

test_matrix = np.array([[1,2,3],[3,4,5]],int) 
scalar = 3

test_matrix + scalar 	#모든성분에 3 합 
test_matrix/scalar		#나누기
test_matrix//scalar 		#몫
test_matrix&scalar 		#나머지
test_matrix**scalar 	#n제곱
#vector-matrix 
matrix = np.arange(1,13).reshape(4,3)
vector = np.arange(10,40,10) 	#[[10,40,10],[10,40,10],[10,40,10]]

matrix + vector 	#addition	
matrix - vector		#subtraction 
matrix * vector 	#product

 

 

 

 


12. numpy performance

# time comparison : for vs. list vs. numpy

def sclar_vector_product(scalar, vector) : 
    
    result = []
    for value in vector : 
        result.append(scalar*value) 
    return result

iteration_max = 1000000
vector = list(range(iteration_max))

scalar = 2

%timeit sclar_vector_product(scalar,vector) 				#for loop 성능
%timeit [scalar*value for value in range(iteration_max)] 	#list pythonic 성능
%timeit np.arange(iteration_max)*scalar 					#numpy 성능

*timeit : 계산 속도 도출

일반적으로 속도는 for loop < list comprehension < numpy 

 

 

 

 

13. comparison : all & any, logical_and, logical_or, isnan, isfinite

#all and any 
a = np.arange(10)

np.all(a>5)		#False 
np.any(a>5) 	#True
#logical_and
a = np.array([1,3,0[], float)
np.logical_and(a>0, a<3) 	#True, False, False
#logical_or 
b = np.array([True, True, False], bool)
c = np.array([False, True, False],bool)
np.logical_or(b,c) 		#array([ True,  True, False])
#isnan
a = np.array([1, np.NaN, np.Inf], float)
np.isnan(a)  	#array([False,  True, False])
#isfinite 
a = np.array([1, np.NaN, np.Inf], float)
np.isfinite(a) 		#array([ True, False, False])

 

 

 

728x90

'Python > Data Analysis' 카테고리의 다른 글

데이터 시각화_matplotlib(1) - plt 기본 설정  (0) 2023.05.21
Pandas(DataFrame)  (0) 2023.05.16