[NumPy] Ch5. N차원 배열의 형태 변경
5-1. 배열의 형태 변경1: reshape()
배열의 차원 변경
reshape(): 배열의 차원을 변경함
- 변경 전과 변경하려는 배열의 원소의 개수가 동일해야 함
# 배열의 차원 변경
arr = np.arange(12)
print(arr, arr.ndim)
arr = arr.reshape((3, 4)) # 원소의 개수가 맞도록 설정
print(arr, arr.ndim)
arr = arr.reshape((2, 3, 2)) # 원소의 개수가 맞도록 설정
print(arr, arr.ndim)
arr = arr.reshape((2, 2, 1, 3)) # 원소의 개수가 맞도록 설정
print(arr, arr.ndim)
차원 자동 지정
arr = arr.reshape(3, -1) # -1 입력
print(arr, arr.ndim)
- -1 입력 시 shape값이 자동으로 결정됨 -> 4
- 지정되지 않은 하나의 차원만 가능(-1 두개는 불가능)
[Curse Of Dimensionality(차원의 저주)]
차원이 증가하면서 학습 데이터 수가 차원의 수보다 적어짐 -> 모델의 성능이 저하되는 현상
- 차원이 커질수록 데이터 사이의 거리가 커지는 현상
- 주로 딥러닝, 머신러닝에서 발생
5-2. 배열의 형태 변경2: resize(), ravel()
배열의 형태 변경
resize(): 배열의 형태를 변경
- 원본 배열이 변경
arr.resize(3, 4) # 배열의 원본이 변경됨 print(arr)
ravel(): 배열을 1차원의 배열로 변환
arr = arr.ravel() # 1차원 배열로 변경
print(arr)
5-3. 배열의 형태 변경3: expand_dims(), squeeze()
배열의 차원 추가
expand_dims(): axis 값을 기준으로 차원을 추가
arr = np.array([1, 2])
print(arr, arr.shape)
arr1 = np.expand_dims(arr, axis=0) # x축을 기준으로 한 차원 추가
print(arr1, arr1.shape)
arr2 = np.expand_dims(arr, axis=1) # y축을 기준으로 한 차원 추가
print(arr2, arr2.shape)
배열의 차원 감소
squeeze(): 배열의 축(axis)을 제거하여 한 차원을 줄임
- axis에 값을 지정하지 않은 경우 1차원으로 차원 축소
arr = np.array([[1, 2]])
print(arr, arr.shape)
# x축을 기준으로 차원 축소
arr1 = np.squeeze(arr, axis=0)
print(arr1, arr1.shape)
arr = np.array([[[1],
[2],
[3]]])
print(arr, arr.shape)
arr2 = np.squeeze(arr, axis=0)
print(arr2, arr2.shape)
# y축을 기준으로 차원 축소
arr = np.array([[[1, 2, 3]]])
print(arr, arr.shape)
arr3 = np.squeeze(arr, axis=1)
print(arr3, arr3.shape)
5-4. 전치행렬(Transpose Matrix)
배열의 전치행렬
대각선 위치의 원소들을 기준으로 원소를 대칭시킴
- 대각 원소의 값은 변하지 않음
정방행렬의 전치행렬
- 정방행렬: 행과 열의 개수가 같은 행렬
arr = np.array([[1, 2], # 정방행렬 [3, 4]]) print(arr.T) print(np.transpose(arr))
- 정방행렬이 아닌 경우 shape가 변하게 됨 (3, 2) -> (2, 3)
동일한 shape의 dot 연산 -> 하나의 행렬을 전치행렬로 변환
arr1 = np.array([[1, 2],
[3, 4],
[5, 6]])
arr2 = np.full((3, 2), 2)
print((arr.T).dot(arr2)) # 행렬의 곱 연산을 하기 위해서는 하나를 전치로 돌려야됨
- 혹은 arr2를 전치행렬로 변환하여 연산