[파이썬] Numpy 차원의 이해
- Python/Numpy
- 2024. 9. 25.
Numpy 차원 이해하기
일전에 Numpy 축에 관한 포스팅을 했었는데 그보다 더 개념적인 얘기를 할까 합니다.
Numpy는 다차원 배열을 다루는만큼 수치계산을 한꺼번에 처리할 수 있도록 도와주는 효율적인 라이브러리입니다. Numpy는 다차원 배열을 차원으로 분류했는데 데이터 구조를 표현하는데 있어서 중요한 역할을 합니다.
Numpy 차원 정의
차원의 종류
Numpy에서 차원은 축이라고도 불리기도 합니다. 우리는 보통 3차원을 쓰기 때문에 그렇기도 한데요. 엄밀히 따지면 차원과 축은 포커싱된 부분이 다릅니다. 차원은 깊이에 더 포커싱이 되어있습니다. 차원은 배열의 층이 얼마나 되는지를 정의합니다. 축은 데이터가 나아가는 방향에 초점이 맞춰져 있습니다. 차원내에서 데이터를 어떻게 다룰것인지를 정의합니다.
다시말해, 배열의 차원은 데이터가 배치된 형태로 다음과 같이 생각할 수 있습니다.
- 0차원(스칼라) : 하나의 숫자 또는 값
- 1차원(벡터): 한줄로 나열된 값들의 리스트
- 2차원(행렬) : 행과 열로 구성된 값
- 3차원(텐서) 이상 : 2차원 행렬이 여러 겹 쌓이는 구조
numpy에서는 대괄호로서 차원을 표현합니다. 대괄호로 얼마나 쌓여있는지로 판단할 수 있습니다. 차원이 높을수록 자신보다 낮은 차원의 값들을 넣을 수 있습니다.
- 0차원 : 14
- 1차원 : [1,2,3]
- 2차원 : [[1,2],[2,3]]
- 3차원 : [[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]]
위와 같이 3차원 안에는 2차원의 값들을 넣고 2차원에는 1차원의 값들을 넣을 수 있습니다. 대괄호의 겹치는 갯수로 차원을 추측할 수 있습니다.
차원 구하기
배열의 차원은 ndim 메쏘드로 구해집니다.
import numpy as np
# 0차원: 스칼라
scalar = np.array(14)
print(scalar.ndim) # 출력: 0
# 1차원: 벡터
vector = np.array([1, 2, 3])
print(vector.ndim) # 출력: 1
# 2차원: 행렬
matrix = np.array([[1, 2], [2, 3]])
print(matrix.ndim) # 출력: 2
# 3차원: 3D 배열
tensor = np.array([[[1, 2, 3], [2, 3, 4]], [[3, 4, 5], [4, 5, 6]]])
print(tensor.ndim) # 출력: 3
차원의 중요성
Numpy는 행렬의 계산을 효율적으로 하기 위해서 자동으로 차원을 맞춰주는 브로드캐스팅 연산방법을 쓰고 있습니다. 따라서, 차원에 따라 연산을 하는 방식이 달라집니다.
예를 들어,
matrix = np.array([[1,2],[3,4]]) # 차원2
vector = np.array([10,20]) # 차원1
result = matrix +vector #차원이 달라 브로드캐스팅 발생
print(result)
차원이 다른 2개의 배열 덧셈을 실행했습니다. 브로드캐스팅으로 연산해 vector를 2차원으로 변경해 덧셈을 실행해 1열에는 10이 더해지고, 2열에는 20이 더해집니다.
이와 같이 오류가 나오는 게 아닌 계산이 되버리므로 차원을 잘 모르는 상태에서 무작정 연산을 하면 기대했던 답이 안 나올 수 있습니다.
브로드캐스팅의 자세한 내용은 아래 포스팅에서 보시기 바랍니다.
Numpy 브로드캐스팅
Numpy에서 하는 행렬의 고유한 연산 방법에 대한 내용은 아래 포스팅을 참고해 주세요.
numpy 행렬곱과 내적 그리고 별연산
차원 변경
차원이 중요한만큼 numpy에서는 배열의 차원을 변경하는 것은 매우 쉽게 만들었습니다. reshape() 메쏘드를 이용하면 차원 변환이 자유로운데요. 내가 원하는 배열로 지정만 해주면 그에 맞게 차원을 변경해줍니다.단, 행렬의 값의 갯수와 일치하게 해주어야 합니다. 6개의 값으로 이루어진 벡터를 행렬로 바꾼다면 2x3, 3x2, 1x6, 6x1으로만 배열이 가능합니다.
reshpae에 대한 자세한 내용은 아래 포스팅을 참고해주시길 바랍니다.
Reshape
array = np.array([1,2,3,4,5])
reshaped_array = array.reshape(2,3)
print(reshaped_array)
차원 확장, 축소하기
차원을 확장하려면 np.newaxis()를, 축소하려면 squeeze() 사용합니다. squeeze인 경우 실제로 차원을 줄여주는게 아니라 없어도 될 불필요한 차원을 없애줍니다. reshpa로 모든 걸 다 할 수 있지만 numpy에서 차원 확장 축소이 가능하다는 걸 보여드리기 위해서 내용을 추가했습니다.
#차원 확장(1->2)
vector = np.array([1,2,3])
expanded_vector = vector[:,np.newaxis]
print(expanded_vector.shape)
# 출력 : (3,1)
실제로 reshape로 하거나 newaxis로 하거나 별반 다를 건 없습니다.
array = np.array([[[1, 2], [3, 4]]])
print(array.shape) # 출력: (1, 2, 2)
# 첫 번째 차원(1)을 제거하고 2차원 배열로 변환
squeezed_array = np.squeeze(array)
print(squeezed_array.shape) # 출력: (2, 2)
squeeze를 사용하면 필요없는 대괄호를 없애줍니다.
차원을 실제로 줄이고 싶다면, reshape를 사용합니다.
vector = squeezed_array.reshape(4,)
print(vector.ndim)
# 출력 : 1
마치며
NumPy의 차원은 데이터를 구조화하고 처리하는 데 매우 중요한 개념입니다. 배열의 차원을 이해하고 다루는 법을 익히면, 다양한 수치 데이터를 더 효과적으로 다룰 수 있습니다.
함께 보면 좋은 글
빅데이터 분석에 관한 글을 더 보고 싶다면 아래 포스팅을 활용해주세요.
'Python > Numpy' 카테고리의 다른 글
[파이썬] 절대값 출력하기 (0) | 2024.03.07 |
---|---|
NumPy를 활용한 다차원 배열의 평탄화 (0) | 2023.06.22 |
[Numpy] 배열(array) 합치기(np.concatenate) (0) | 2022.01.05 |
[Numpy] 배열 분할하기(np.split) (0) | 2022.01.03 |
[Numpy] 분포함수(distribution) (0) | 2021.11.20 |