NumPy에서 flatten과 ravel 함수의 차이점
NumPy에서 flatten
과 ravel
함수는 모두 다차원 배열을 1차원 배열로 변환하는 데 사용됩니다. 하지만 두 함수는 다음과 같은 몇 가지 중요한 차이점이 있습니다.
주요 차이점
구분 | flatten | ravel |
---|---|---|
복사 여부 | 원본 배열을 복사하여 새로운 배열을 생성합니다. | 원본 배열을 직접 변형하여 1차원 배열로 만듭니다. |
차원 유지 | 원본 배열의 차원 정보를 유지합니다. (order 매개변수를 통해 변경 가능) | 원본 배열의 차원 정보를 버립니다. |
성능 | 일반적으로 ravel이 더 빠릅니다. | flatten이 더 느릴 수 있습니다. |
사용 용도 | 특정 차원 순서를 유지해야 하는 경우에 유용합니다. | 메모리 효율성이 중요하거나 계산 속도를 높여야 하는 경우에 유용합니다. |
예시
import numpy as np
# 2차원 배열
a = np.array([[1, 2, 3], [4, 5, 6]])
# flatten
b = a.flatten()
print(b) # [1 2 3 4 5 6]
# ravel
c = a.ravel()
print(c) # [1 2 3 4 5 6]
# 차원 정보 확인
print(b.ndim) # 1
print(c.ndim) # 1
# 원본 배열 변경
a[0, 0] = 100
# flatten은 복사본이므로 영향을 받지 않습니다.
print(b) # [1 2 3 4 5 6]
# ravel은 원본 배열을 직접 변형하므로 영향을 받습니다.
print(c) # [100 2 3 4 5 6]
결론
flatten
과 ravel
함수는 모두 다차원 배열을 1차원 배열로 변환하는 데 사용할 수 있지만, 복사 여부, 차원 유지, 성능 등의 차이점이 있습니다. 따라서 사용 목적에 따라 적절한 함수를 선택해야 합니다.
예제 코드
import numpy as np
# 2차원 배열
a = np.array([[1, 2, 3], [4, 5, 6]])
# flatten
b = a.flatten()
# ravel
c = a.ravel()
# 차원 정보 확인
print(a.ndim) # 2
print(b.ndim) # 1
print(c.ndim) # 1
# 원본 배열 변경
a[0, 0] = 100
# flatten은 복사본이므로 영향을 받지 않습니다.
print(a)
# [[100 2 3]
# [ 4 5 6]]
print(b)
# [ 1 2 3 4 5 6]
# ravel은 원본 배열을 직접 변형하므로 영향을 받습니다.
print(c)
# [100 2 3 4 5 6]
a
라는 2차원 배열을 생성합니다.flatten
함수를 사용하여a
배열을 1차원 배열b
로 변환합니다.a
,b
,c
배열의 차원 정보를 확인합니다.a
배열의 첫 번째 요소를 변경합니다.a
,b
,c
배열을 출력합니다.
결과
b
배열은 변경되지 않았습니다.c
배열은a
배열의 변경 사항을 반영합니다.
다차원 배열을 1차원 배열로 변환하는 대체 방법
for 루프 사용
def flatten_for_loop(a):
result = []
for i in range(a.shape[0]):
for j in range(a.shape[1]):
result.append(a[i, j])
return np.array(result)
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_for_loop(a)
print(b) # [1 2 3 4 5 6]
np.nditer 사용
def flatten_nditer(a):
result = []
for i in np.nditer(a):
result.append(i)
return np.array(result)
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_nditer(a)
print(b) # [1 2 3 4 5 6]
리스트 내포 사용
def flatten_list_comprehension(a):
return np.array([x for row in a for x in row])
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_list_comprehension(a)
print(b) # [1 2 3 4 5 6]
np.concatenate 사용
def flatten_concatenate(a):
return np.concatenate(a.ravel())
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_concatenate(a)
print(b) # [1 2 3 4 5 6]
np.reshape 사용
def flatten_reshape(a):
return a.reshape(-1)
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_reshape(a)
print(b) # [1 2 3 4 5 6]
zip 사용
def flatten_zip(a):
return np.array([x for y in a for x in y])
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_zip(a)
print(b) # [1 2 3 4 5 6]
itertools 사용
from itertools import chain
def flatten_itertools(a):
return np.array(list(chain(*a)))
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_itertools(a)
print(b) # [1 2 3 4 5 6]
pandas 사용
import pandas as pd
def flatten_pandas(a):
return pd.DataFrame(a).stack().values
a = np.array([[1, 2, 3], [4, 5, 6]])
b = flatten_pandas(a)
print(b) # [1 2 3 4 5 6]
특정 라이브러리 사용
scikit-learn
:sklearn.utils.extmath.flatten
torch
:torch.flatten
tensorflow
:tf.reshape
선택 기준
- 코드 간결성
- 성능
- 메모리 사용량
- 사용 편의성
python numpy multidimensional-array