Numpy

Jaykang·2021년 12월 19일
0

https://www.edwith.org/onlyboostcampaitech3/lecture/1203373?isDesc=false 강의를 통해서 numpy 리마인드

머신러닝, 딥러닝에서는 선형 대수가 필수인데 파이썬에서는 리스트로 행렬과 벡터를 표현한다. 하지만 리스트는 연산 속도가 느린편이라는 문제가 있다. 그리고 파이썬은 다른 언어에 비해서 속도가 느린편이다. 그래서 이러한 문제를 해결하기 위해 numpy라는 패키지를 사용한다.

Numpy의 특징

  • 일반 list에 비해서 빠르고 메모리 효율적이다
  • 반복문 없이 데이터 배열에 대한 처리를 지원한다
  • 선형대수와 관련된 다양한 기능을 제공한다
  • C, C++, 포트란 등의 언어와 통합 가능하다

numpy는 np.array 함수를 화용해서 배열을 생성한다. ndarray를 객체라고 부른다. numpy는 list와 다르게 하나의 데이터 type만 배열에 넣을 수 있다. numpy는 차례대로 값이 들어간다. 그래서 연산 속도가 빠르다. 하지만 python list는 한 단계 들어가고 그 주소를 기반으로 한 단계 더 들어가서 값을 불어오는 개념이라 변경하는게 굉장히 쉽지만 연산 속도가 느리다.

a = [1, 2, 3, 4, 5]
b = [5, 4, 3, 2, 1]
a[0] is b[-1] #True
a = np.array(a)
b = np.array(b)
a[0] is b[-1] #False

shape: numpy array의 dimension을 return 해주는 함수
dtype: numpy array의 data type을 return 해주는 함수
dtype은 어떻게 설정해주는지에 따라 연산량, 속도에 영향을 줄 수 있어서 중요하다.

Rank별 array 이름

RankNameExample
0scalar7
1vector[10,10]
2matrix[[1,10], [15,15]]
33-tensor[[[1,5,9], [2,6,10]], [[3,7,11], [4,8,12]]]
nn-tensor

shape

reshape: array의 shape의 크기를 변경한다, element의 갯수는 동일
(2, 4) -> (8, )

np.array(test_matrix).reshape(2, 4).shape # 2*4 = 8
np.array(test_mattrix).reshape(-1, 2).shape # -1은 4로 세팅된다

여기서 -1은 size(element의 갯수)를 기반으로 row 개수를 설정해주는 것이다.

flatten

flatten: 다차원 array를 1차원 array로 변환해준다

np.array(test_matrix).flatten()

indexing & slicing

list와 다르게 이차원 배열에서 [0,0] 표기법을 제공한다. matrix의 경우 앞은 row 뒤는 column을 의미한다. list와 다르게 행과 열 부분을 나눠서 slicing이 가능하다. matrix의 부분 집합을 추출할 때 유용하다.

a = np.array([[1,2,3,4,5], [6,7,8,9,10]], int)
a[:,2:] # 전체 row의 2열 이상
a[1,1:3] # 1행의 1~2열
a[1:3] # 1~2행
arr[:,::2] # , : <- start point, : <- end point, 2 <- step(2칸씩)

creation function

arange: array의 범위를 지정하여 값의 list를 생성하는 명령어

np.arange(0, 5, 0.5) # start, end, step
np.arange(30).reshape(5, 6)

zeros: 0으로 가득찬 ndarray생성
ones: 1로 가득찬 ndarray생성

np.zeros(shape=(10, ), dtype=np.int8)
np.zeros((2,5))
np.ones(shape=(10, ), dtype=np.int8)
np.ones((2,5))

empty: shape만 주어지고 비어있는 ndarray생성, memory initialization이 되지 않는다.

np.empty(shape=(10,), dtype=np.int8) #값이 남아있을 수 있음

something_like: 기존 ndarray의 shape크기 만큼 1, 0 또는 empty array를 반환해준다.

test_martrix = np.arange(30).reshape(5,6)
np.ones_like(test_matrix) #5 by 6 1로만 구성된 행렬

identity

단위 행렬(I 행렬)을 생성한다.

np.identity(n=3, dtype=np.int8)
np.identity(5)

eye: 대각선이 1인 행렬, k값의 시작 index를 변경할 수 있다.

np.eye(3)
np.eye(3,5, k=2)
#[[0., 0., 1., 0., 0.],
# [0., 0., 0., 1., 0.],
# [0., 0., 0., 0., 1.]]

diag

대각 행렬의 값을 추출해준다

matrix = np.arange(9).reshape(3,3)
np.diag(matrix)
# [0, 4, 8]
np.diag(matrix, k=1) # k: start index
#[1, 5]

random sampling

np.random.uniform(0,1,10).reshape(5,6)
np.random.exponential(scale=2, size=100)

operation functions

test_array = np.arange(1, 11)
test_array.sum()
test_array.mean()

axis: 모든 operation function을 실행할 때 기준이 되는 dimension 축

test_array = np.arange(1,13).reshape(3,4)
test_array.sum(axis=1) #[10, 26, 42]
test_array.sum(axis=0) #[15, 18, 21, 24]

concatenate

numpy array를 합치는(붙이는) 함수

a = np.array([1,2,3])
b = np.array([2,3,4])
np.vstack((a, b))

a = np.array([ [1], [2], [3] ])
b = np.array([ [2], [3], [4] ])
np.hstack((a,b))

a = np.array([1,2,3])
b = np.array([2,3,4])
np.concatenate((a, b), axis = 0)

a = np.array([[1, 2], [3, 4]])
b = np.array([[5,6]])
b = b[np.newaxis, :]
np.concatenate((a,b.T), axis = 1)

array operation

numpy array간의 기본적인 사칙 연산은 지원해준다. element-wise operation이 중요한데 array간의 shape이 같을 때 같은 위치 요소들끼리 연산이 수행된다. 원래 행렬 곱 같은 연산을 할거면 *가 아니라 dot으로 수행해야 한다.

shape이 다른 배열간의 연산을 하면 boradcasting 연산이 수행된다. 그래서 실수하지 않게 주의해야한다.

comparisions

any: 하나라도 조건에 만족한다면 true
all: 모두가 조건에 만족한다면 true

a = np.arange(10) #0~9
a < 4 # True, True, ...., False
np.any(a>5), np.any(a<0) # (True, False)
np.all(a>5), np.all(a<10) # (False, True)                          

numpy는 배열의 크기가 동일 할 때 element간 비교의 결과를 Boolean type으로 return해준다.

np.logical_and(a>0, a<3) # 두 번해서 모두 True면 True 아니면 False
np.logical_not() #True, False 반대로    
np.logical_or() # 하나라도 True면 True

np.where

np.where(a < 3, 3, 2) #where(condition, True, False)                   
a = np.arange(10)
np.where(a>5) #index return [6,7,8,9]
np.isnan(a) # Not a number
np.isfinite(a) #finite number

np.argmax & argmin

array에서 최대값 또는 최소값의 index를 반환한다.

  a = np.array([1,2,4,5,8,85,23,3])
  np.argmax(a), np.argmin(a) #(5, 0)
  
  b = np.array([[1,2,4,7], [9,88,6,45], [9,76,3,4]])
  np.argmax(b, axis=1), np.argmin(b, axis=0) # [3, 1, 1] , [0, 0 ,2 ,2]

boolean index

특정 조건에 따른 값을 배열 형태로 추출

test_array[test_array > 3]

condition = test_array < 5
test_array[condition]                            

fancy index

numpy는 array를 index value로 사용해서 값을 추출할 수 있다.

a = np.array([2, 4, 6, 8], float)
b = np.array([0, 0, 1, 3, 2, 1], int)
a[b] #[2., 2., 4., 8., 6., 4.]  # b를 index로 하여 a의 값들을 추출한다     
a.take(b) #[2., 2., 4., 8., 6., 4.]   
profile
Just Do

0개의 댓글