2024.11.27 TIL (NumPy, arr, shape)

SMALL

[ TIL ]

강의를 들으면서 NumPy를 설치하고 선생님따라 코드 작성하고 실행시켜보는데 이해가 안돼서 따로 찾아봤다.

import numpy as np
arr = np.array([1,2,3,4,5,6])

arr
>>>array([1, 2, 3, 4, 5])

type(arr)
>>>numpy.ndarray

print(arr)
>>>[1 2 3 4 5]

arr_2 = arr.reshape((1,6))
arr_2
>>>array([[1, 2, 3, 4, 5, 6]])

arr.shape
>>>(6,)

arr_2.shape
(1, 6)

여기서 arr.shape는 왜 (6,)이고 arr_2.shape는 왜 (1, 6)인지??

 

arr는 np.array([1, 2, 3, 4, 5, 6])로 1차원 배열이다.

그래서 print(arr.shape)를 했을 때 

  • 배열에 6개의 요소가 있고, 1차원이라 (6,)로 표시된다.
  • 즉, "길이가 6인 1차원 배열"을 의미한다.

 

다음으로, arr_2는 arr.reshape((1, 6))로 2차원 배열로 재구성된 배열이다.

그래서 print(arr_2.shape)를 했을 때

  • 1개의 행(row)과 6개의 열(columns)을 가져서 (1, 6)으로 표시된다.
  • 즉, " 1행 6열의 2차원 배열"을 의미한다.
  • reshape을 통해 차원을 추가해서 2차원 배열로 변환되었다.

 

결국, Numpy 배열의 차원 표현 방식이 저런 것이었다.

  • 1차원 배열은 (n,)처럼 단일 숫자로 표현된다. 여기서 n은 요소의 개수.
  • 2차원 배열은 (rows, columns) 형식으로 행과 열의 개수를 모두 포함한다.

reshape 메서드

  • 차원을 명시적으로 지정할 수 있다.
  • (1, 6)을 사용하면 행(row) 1개와 열(column) 6개를 가지는 2차원 배열이 된다.
  • 이는 배열에 추가적인 계층을 추가했다고 이해할 수 있다.

이렇게 알고나니까 shape가 뭔지 궁금해서 좀 더 찾아보게 되었다.

 

Shape는 Numpy 배열의 구조(차원의 크기)를 나타내는 속성이다.

배열의 각 차원별 크기(size)를 튜플(tuple) 형태로 제공한다.

 

1차원 배열:

shape는 (n,) 형식.

n은 배열의 총 요소 개수.

arr = np.array([1, 2, 3, 4])
print(arr.shape)  # (4,)

 여기서 (4,)는 "길이 4의 1차원 배열"을 의미.

 

 

2차원 배열:

shape는 (rows, columns) 형식.

arr = np.array([[1, 2], [3, 4], [5, 6]])
print(arr.shape)  # (3, 2)

 (3, 2)는 "3개의 행과 2개의 열"이 있는 배열.

 

해당 2차원 배열을 3차원으로 바꾼다면?

 

import numpy as np

# 주어진 2D 배열
arr = np.array([[1, 2], [3, 4], [5, 6]])

# 3D로 변환
arr_3d = arr.reshape(2, 3, 2)

print(arr_3d)
3D 배열:
[[[1 2]
  [3 4]
  [5 6]]

 [[7 8]
  [9 10]
  [11 12]]]

3D 배열의 shape: (2, 3, 2)

 

 

3차원 배열 (다차원 배열):

shape는 (depth, rows, columns) 형식.

arr = np.ones((2, 3, 4))
print(arr.shape)  # (2, 3, 4)

 (2, 3, 4)는 "2개의 2차원 배열, 각 배열은 3개의 행과 4개의 열"을 의미.

 

 

Depth란?

다차원 배열에서 가장 바깥쪽 차원의 개수를 나타내는 용어로 3차원 이상의 배열에서 "배열의 층(layer)"을 의미

 

  • Numpy 배열은 다차원 배열을 지원하며, 각 차원은 행(row), 열(column), 그리고 그 위의 층(layer)으로 구분된다.
  • depth는 3차원 배열 이상에서만 나타난다.
  • Shape의 첫 번째 값은 depth를 나타냄.

 

Depth의 시각적 이해

1. 2차원 배열 (depth 없음)    Shape (2, 2)

arr = np.array([[1, 2], [3, 4]])
print(arr.shape)  # (2, 2)

 

 

2. 3차원 배열 (depth 존재)    Shape (2, 2, 2)

arr = np.array([
    [[1, 2], [3, 4]], 
    [[5, 6], [7, 8]]
])
print(arr.shape)  # (2, 2, 2)

 

 

Depth의 예시

예시 1: 3차원 배열

arr = np.ones((4, 3, 2))
print(arr.shape)  # (4, 3, 2)

Shape (4, 3, 2):

  • 4: 배열의 depth, 즉 4개의 층(layer)로 구성.
  • 3: 각 층의 행(row) 수.
  • 2: 각 층의 열(column) 수.

 

예시 2: 4차원 배열

arr = np.zeros((5, 4, 3, 2))
print(arr.shape)  # (5, 4, 3, 2)

 

Shape (5, 4, 3, 2):

  • 5: 가장 바깥쪽 배열에 5개의 depth(층)가 있다.
  • 4: 각 depth는 4개의 배열을 포함.
  • 3: 각 배열의 행 수.
  • 2: 각 배열의 열 수.
나의 질문 : 4차원을 이렇게 이해하면 될까요?
답은 YES!
( 나름대로 이해하려고 그림판으로 그려서 튜터님께 질문을 했다.)
혼자 이해하려고 노력한 흔적

 

그리고 얻은 엄청난 꿀팁 대괄호를 세면 차원의 수가 보인다!

arr = np.array([
    [[1, 2], [3, 4]], 
    [[5, 6], [7, 8]]
])
print(arr.shape)  # (2, 2, 2)

이 경우 대괄호가 3개 있으니까 3차원!

그리고 Shape (5, 4, 3, 2)을 예로 들었을 때,

오른쪽 첫번째 숫자 기준으로 왼쪽으로 차원이 하나씩 늘어나고 있는 모습을 보여준다.

 

 

 

Depth를 활용하는 경우

  1. 이미지 데이터:
    • 컬러 이미지는 3차원 배열로 표현된다.
      • 예: (height, width, color_channels)
    • 여러 이미지를 한 번에 처리하려면 4차원 배열로 확장된다.
      • 예: (num_images, height, width, color_channels)에서 num_images가 depth 역할.
  2. 딥러닝 데이터:
    • 딥러닝 모델에서 입력 데이터를 batch 단위로 처리할 때, 배치 크기가 depth가 된다.
      • 예: (batch_size, height, width, features).
  3. 3D 시뮬레이션 및 과학 데이터:
    • 시간 축(time step)이나 공간 축을 포함한 다차원 데이터에서 depth가 유용하다.

 

LIST

'Today I learned' 카테고리의 다른 글

판다스의 고오급 기능  (3) 2024.11.28
2024.11.28 TIL (판다스-데이터변형)  (0) 2024.11.28
2024.11.26 TIL (+프로그래머스,SQL 질문과 답)  (2) 2024.11.26
2024.11.22 TIL(AI 9기)  (0) 2024.11.22
2024.11.21 TIL(AI 9기)  (1) 2024.11.21