넘파이 flatten() 함수
NumPy의 flatten() 함수는 다차원 배열을 1차원 배열로 평탄화하는 데 사용된다. 이 함수는 항상 원본 배열의 복사본을 만들어 반환한다. 따라서 반환된 1차원 배열을 수정하더라도 원본 배열은 영향을 받지 않는다.
아래는 flatten() 함수에 대한 특징이다.
- 새로운 배열 생성 - flatten() 함수는 항상 새로운 1차원 배열을 생성하여 반환한다. 이는 메모리 사용량이 늘어날 수 있고, 큰 배열의 경우 성능에 영향을 줄 수 있다.
- 복사 오버헤드 - flatten() 함수는 배열을 1차원으로 평탄화하기 위해 복사본을 만들어야 한다. 따라서 큰 배열을 다뤄야 할 때는 오버헤드가 있을 수 있다.
- 뷰(View)가 아닌 복사 - flatten()은 항상 원본 배열의 복사본을 반환하므로, 반환된 배열을 수정해도 원본 배열에는 영향을 미치지 않는다.
- 다차원 배열의 평탄화 - flatten()은 다차원 배열을 1차원으로 평탄화하는데 사용된다. 만약 1차원 배열인 경우에는 아무런 영향이 없다.
그럼 이제 flatten() 함수의 예제 코드를 살펴보며 사용법을 익혀보자.
import numpy as np
# 2차원 배열 생성
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# flatten() 함수를 사용하여 배열을 1차원으로 평탄화
flattened_arr = arr.flatten()
print(flattened_arr)
# 출력: [1 2 3 4 5 6]
# flattened_arr의 값을 변경해도 arr은 영향을 받지 않음
flattened_arr[0] = 99
print(arr)
# 출력: [[1 2 3]
# [4 5 6]]
마찬가지로 flatten() 함수를 사용해 다차원 배열을 1차원으로 평탄화하는 함수이다. 따라서 arr은 2차원 배열이었지만 , flatten() 함수를 사영하면 1차원 배열로 변환된다. flatten_arr[0] = 99와 같이 flattened_arr의 값을 변경해도, arr에는 영향을 주지 않는다. 이는 flatten() 함수가 새로운 배열로 복사본을 반환하기 때문이다. 따라서 뷰(View)를 반환하는 ravel() 함수와 달리 속도는 ravel() 함수보다 느리지만 flatten() 함수는 메모리를 공유하지 않기 때문에 복사본 배열을 변경하여도 원본 배열에 영향을 미치지 않는다.
NumPy에서 말하는 뷰(View)가 무엇인가?
NumPy에서의 뷰(View)는 새로운 배열 객체를 생성하지 않고 기존 배열의 데이터에 대한 다른 형태의 보기(View)를 제공하는 개념이다.
flatten() 함수 사용시 주의할 점
flatten() 함수를 사용할 때 오류가 발생하는 케이스는 매우 드물지만, 주의해야 할 몇 가지 케이스가 있다.
- 메모리 부족 - 배열이 매우 큰 경우, 해당 배열을 1차원으로 평탄화하면 메모리 부족으로 인해 오류가 발생할 수 있다.
- 읽기 전용 배열 - 원래 배열이 읽기 전용일 경우에는 flatten()을 사용하여 수정하려고 할 때 오류가 발생할 수 있다. 이 경우에는 copy() 함수를 사용하여 새로운 배열을 만들어 수정해야 한다.
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# flatten()을 사용하여 읽기 전용 배열 수정하려고 하면 오류 발생
try:
read_only_arr = arr.flatten()
# 읽기 전용 배열을 만듬
read_only_arr.flags['WRITEABLE'] = False
print('read_only_arr 배열에 대한 정보')
print(read_only_arr.flags)
read_only_arr[0] = 99
print(f'flattened_arr : {read_only_arr}')
except ValueError as e:
print(f"ValueError : {e}")
read_only_arr 배열에 대한 정보
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : False
ALIGNED : True
WRITEBACKIFCOPY : False
ValueError : assignment destination is read-only
실행 결과
flatten() 함수를 사용하여 1차원 배열을 반환받아 read_only_arr 변수에 저장하고 flags 속성을 이용하여 읽기 전용으로 변경해주었다. 그 후, 배열 요소에 대한 값을 변경하려고 시도할 경우 위의 출력 결과와 같이 ValueError가 발생하는 것을 확인할 수 있다.
읽어주셔서 감사합니다.