새소식

반응형
Library/NumPy

[NumPy] 넘파이 squeeze() 함수

  • -
반응형

넘파이 로고입니다.
넘파이

넘파이 squeeze() 함수


sequeeze() 함수는 배열의 크기가 1인 차원을 제거하여 배열의 형상을 변경하는 데 사용된다. 주로 1인 차원을 제거하여 배열의 불필요한 차원을 축소하거나, 스칼라 값을 포함하는 배열을 스칼라 값으로 변환하는 데 유용하다. 함수의 이름 그대로 차원을 쥐어짜 내어 차원을 제거한다고 생각하면 된다.

 

squeeze() 함수의 기본 구조

import numpy as np
np.squeeze(a, axis = None)
  • a - 차원을 제거할 입력 배열이다.
  • axis(선택적) - 특정한 축(들)에 대해서만 차원을 제거한다. 기본값은 None으로, 모든 크기가 1인 차원을 제거한다.
import numpy as np

arr = np.array([[[0]], [[0]], [[0]]])

print(f"BEFORE : {arr.shape}")

# 모든 크기가 1인 차원을 제거
arr_squeezed = np.squeeze(arr)
print(f"AFTER : {arr_squeezed.shape}")

squeeze() 함수는 배열의 크기가 1인 차원, 즉 요소가 1개밖에 없는 차원을 제거한다. 이 점을 다시 기억하며 위의 예제 코드를 한 번 살펴보자. 먼저 arr 배열은 3차원 배열이며 구성은 아래와 같이 돼있다.

 

[ → 첫 번째 차원(안에 요소가 3개 있음)

    [ → 두 번째 차원(안에 요소가 1개 있음)

        [0] → 세 번째 차원(안에 요소가 1개 있음)

    ]

    [ → 두 번째 차원(안에 요소가 1개 있음)

        [0] → 세 번째 차원(안에 요소가 1개 있음)

    ]

    [ → 두 번째 차원(안에 요소가 1개 있음)

        [0] → 세 번째 차원(안에 요소가 1개 있음)

    ]

]

 

위의 그림을 보며 각 차원의 요소 길이가 1(요소 개수가 1)인 차원들을 한 번 지워보자. 그러면 아래의 출력 결과와 같은 결괏값이 나오는 게 이해가 갈 것이다. 첫 번째 차원은 요소가 3개이므로 제거되지 않는다.

BEFORE : (3, 1, 1)
AFTER : (3,)

실행 결과

 

크기가 1인 차원을 포함하는 4차원 배열

import numpy as np

# 3차원 배열 생성 
arr = np.zeros((2,1,3), dtype = int)
print("Shape of Original Array")
print(arr.shape)
print(arr)  

# squeeze() 함수로 크기가 1인 차원 제거
arr_squeezed = np.squeeze(arr)

# 결과 출력
print("\nShape of Array after squeezing")
print(arr_squeezed.shape) 
print(arr_squeezed)

위의 예제 코드는 배열의 사이즈가 (2,1,3)이다. 두 번째 차원의 크기가 1이므로 squeeze() 함수를 사용 후, 배열의 크기는 (2,3)이 된다. 아래의 결과를 확인해 보자.

Shape of Original Array
(2, 1, 3)
[[[0 0 0]]

 [[0 0 0]]]

Shape of Array after squeezing
(2, 3)
[[0 0 0]
 [0 0 0]]

실행 결과

 

 

크기가 0인 차원과 1인 차원을 포함하는 4차원 배열

import numpy as np

# 크기가 1인 차원을 포함한 배열 생성
arr = np.array([[[[1]]]])

# squeeze() 함수로 크기가 1인 차원 제거
arr_squeezed = np.squeeze(arr)

# 결과 출력
print("Original Array")
print(f"Size : {arr.size}")
print(arr)
print()
print("Array after squeezing")
print(f"Size : {arr_squeezed.size}")
print(arr_squeezed)

크기가 1인 차원을 가진 4차원 배열을 생성하고, squeeze() 함수를 사용하여 크기가 1인 차원을 제거했다. 결과 배열은 해당 차원이 제거되어 스칼라 값인 1이 된다.(크기가 0인 차원은 해당 차원이 존재하지 않는 것을 의미한다.)

Original Array
Size : 1
[[[[1]]]]

Array after squeezing
Size : 1
1

실행 결과

 

 

import numpy as np

# 크기가 1인 차원을 포함한 3차원 배열 생성
arr = np.array([[[1], [2], [3]]])

# squeeze() 함수로 크기가 1인 차원 제거
arr_squeezed = np.squeeze(arr)

# 결과 출력
print("Original Array")
print(f"Size : {arr.size}")
print(arr)
print()
print("Array after squeezing")
print(f"Size : {arr_squeezed.size}")
print(arr_squeezed)

크기가 1인 차원이 있는 3차원 배열을 생성하고, squeeze() 함수를 사용하여 크기가 1인 차원을 제거하는 코드이다. 결과적으로 1차원 배열이 만들어진다. 아래의 결과를 확인해 보자.

Size : 3
[[[1]
  [2]
  [3]]]

Array after squeezing
Size : 3
[1 2 3]

실행 결과

 

 

지금까지 squeeze() 함수를 사용하는 방법에 대해 알아보았다, 정리하자면 squeeze() 함수는 크기가 1인 차원을 제거하는 함수이며 배열의 모양을 변경하거나 특정한 형태의 배열을 원할 때 사용된다. 다음은 squeeze() 함수가 유용하게 쓰일 수 있는 몇 가지 상황이다.

 

딥러닝 모델의 예측값 처리

딥러닝 모델에서 예측값을 다룰 때, 종종 크기가 1인 차원이 추가될 수 있다. 이때 squeeze() 함수를 사용하여 불필요한 차원을 제거할 수 있다.

predictions = model.predict(input_data)  # (batch_size, 1, num_classes)
predictions_squeezed = np.squeeze(predictions, axis = 1)  # (batch_size, num_classes)

 

 

이미지 처리에서 배치 차원 제거

이미지 데이터의 경우, 배치 차원이 크기 1일 수 있다. 이를 제거하여 이미지 데이터를 단일 이미지로 바꿀 수 있다.

batch_images = np.random.rand(10, 1, 28, 28)  # 10개의 이미지, 각 이미지는 (1, 28, 28) 크기
single_image = np.squeeze(batch_images, axis = 1)  # (10, 28, 28)

 

 

데이터 전처리에서 차원 정리

데이터 전처리 단계에서 크기가 1인 차원을 가진 배열을 다룰 때 유용하다.

data = load_data()  # (samples, 1, features)
data_processed = np.squeeze(data, axis = 1)  # (samples, features)

 

 

squeeze() 함수는 크기가 1인 차원을 제거하는 데 사용되지만, 주의할 점은 크기가 1이 아닌 차원에는 영향을 미치지 않는다. 따라서 크기가 1인 차원을 확인하고 해당 차원을 제거할 수 있다. 만약 다차원 배열을 1차원 배열로 변경하고 싶을 경우 flatten() 함수를 사용하면 된다.

 

 

읽어주셔서 감사합니다.

728x90
반응형

'Library > NumPy' 카테고리의 다른 글

[NumPy] 넘파이 newaxis  (1) 2023.11.30
[NumPy] 넘파이 배열(array)  (0) 2023.11.26
[NumPy] 넘파이 moveaxis() 함수  (0) 2023.11.25
[NumPy] 넘파이 swapaxes() 함수  (1) 2023.11.24
[NumPy] 넘파이 ravel() 함수  (0) 2023.11.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.