딥러닝의 Tensor => numpy array로 주로 표현한다. Tensor의 기본에 대해 이해하고 python numpy의 기본 도구들을 익히자
Tensor의 이해
0차원(scalar)
1 2 3 4 5
| import numpy as np
arr = np.array(5) arr.shape arr.ndim
|
스칼라로 들어간 넘파이 배열. shape가 아무것도 없는 것으로 나온다.
1차원(vector)
1 2
| arr = np.array([5]) arr.shape
|
- numpy에서
1차원 텐서의 shape을 표현할때 (1)이 아닌 (1, ) 과 같이 표현
한다.
- 이건 shape이기 때문에 1이라는 값이 들어갔다는게 아니다. 1차원에 1개의 값이 들어갔다는 의미.
- 마찬가지로 예를들어 (3, ) 은 1차원에 3개의 값이 들어갔다는 의미이다.
2차원(matrix)
1 2
| arr = np.array([[1,2,3], [1,2,3]]) arr.shape
|
다차원
1 2
| arr = np.array([[[1],[2],[3]], [[1],[2],[3]], [[1],[2],[3]]]) arr.shape
|
Numpy기초
0과 1로 채워진 numpy array만들기
np.zeros() : 0으로 채워진 numpy array 만들기
np.ones() : 1으로 채워진 numpy array 만들기
1 2 3 4
| zeros = np.zeros([2, 3]) ones = np.ones([3, 2]) zeros ones
|
1 2 3 4 5 6 7
| Out: array([[0., 0., 0.], [0., 0., 0.]]) array([[1., 1.], [1., 1.], [1., 1.]])
|
특정 범위의 숫자로 채워진 numpy array만들기
np.arrange(M, N) : M부터 N-1까지의 수로 채워진 numpy array를 만들어준다
1 2
| arr = np.arrange(4, 7) arr
|
(응용) reshape와 섞어서 쓰기
1 2
| arr = np.arrange(4, 8).reshape(2, 2) arr
|
1 2 3
| Out: array([4, 5], [6, 7])
|
(응용) array의 index로 접근하기
1 2 3 4
| nums = [1, 2, 3, [1, 2, 3, 4]] arr[1] arr[1, 0] nums[4]
|
1 2 3 4
| Out: array([6, 7]) 6 [1, 2, 3, 4]
|
(응용) index로 slicing하기
1 2 3
| arr = np.arrange(9).reshape(3, 3) arr[1:] arr[1:, 1:]
|
1 2 3 4
| array([3, 4, 5], [6, 7, 8]) array([4, 5], [7, 8])
|
(응용) Boolean indexing
1 2
| data = np.random().radn(2, 2) // 랜덤한 숫자로 2*2 배열 생성 data <= 0 // 0보다 작은 숫자 이렇게 boolean으로 바로 찾을수도 있다.
|
1 2 3
| Out: array([ True, False], [False, False])
|
Broadcast
- 연산하려는 행렬의 shape, 값 등을 조정하기 위한 테크닉 알 필요가 있다.
1 2 3 4
| arr = np.arrange(9).reshape(3, 3) arr + 3 // 모든 값에 3씩 더해준다 arr + np.array([1, 2, 3]) // 각 행마다 [1, 2, 3]을 더해준다 arr * 3 // 모든 값에 3을 곱해준다
|
기타
np.argmax(arr) : 가장 값이 큰 value의 인덱스를 반환한다. argmin()도 있다.
np.unique(arr) : array안에 있는 unique한 값들을 numpy array형태로 반환해준다.
np.dtype() : array의 data type(dtype)을 반환해준다.
- 기본적으로 그냥 [1, 2, 3] 뭐 이렇게 넣으면 알아서 ‘int64’ 타입으로 들어간다.
- 배열 생성시에 데이터 타입을 지정해줄 수도 있다 : (예시)
np.array([[1., 2, 3], [1, 2, 3]], dtype=np.uint8)
np.astype(‘data type’) : 값의 data type을 원하는 타입으로 변환해준다.
np.ndim() : 차원 수를 return
np.size() : size 확인
np.reshape() : resize()와는 다르게 사이즈는 유지하면서 모양/차원만 바꿔준다.
np.random.rand(M, N, …) : (M, N, …) 차원의 배열을 랜덤한 숫자로 채워 생성한다.
np.ravel() : 차원을 1차원으로 바꿔서 펼쳐준다. Layer의 flatten을 위한 기능이라고 생각하면 된다.
값을 유지하며 차원을 늘리자 : np.expand_dims()
: reshape으로도 차원을 늘릴 수는 있지만 동일한 형태 유지하면서 차원만 늘리려면 안에 들어있는 값 개수를 알아야 한다. 개수를 모를때 차원을 늘리기 위해 사용할 수 있는 함수가 expand_dims()
1 2 3 4
| arr.expand_dims( arr, // 차원을 늘릴 numpy array 0 // 0: 차원을 뒤에 붙임, -1: 차원을 앞에 붙임 )
|