1 minute read

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를 전치행렬로 변환하여 연산



인프런: 데이터 과학을 위한 파이썬 NumPy Basic

Tags:

Categories:

Updated: