NumPy reshape(): Python에서 NumPy 배열을 재구성하는 방법
게시 됨: 2022-04-20이 튜토리얼에서는 NumPy reshape() 를 사용하여 원본 데이터를 변경하지 않고 NumPy 배열을 재구성하는 방법을 배웁니다.
Numpy 배열로 작업할 때 종종 기존 배열을 다른 차원의 배열로 모양을 바꾸고 싶을 수 있습니다. 이는 여러 단계로 데이터를 변환할 때 특히 유용할 수 있습니다.
그리고 NumPy reshape()
를 사용하면 쉽게 할 수 있습니다. 다음 몇 분 동안 reshape()
를 사용하는 구문과 배열을 다른 차원으로 변형하는 방법을 배우게 됩니다.
NumPy 배열에서 재구성이란 무엇입니까?
NumPy 배열로 작업할 때 먼저 1차원 숫자 배열을 만들고 싶을 수 있습니다. 그런 다음 원하는 차원의 배열로 모양을 변경합니다.
이는 새 배열의 차원이 처음에 알려지지 않았거나 실행 중에 유추된 경우에 특히 유용합니다. 또는 특정 데이터 처리 단계에서 입력이 특정 모양이어야 하는 경우도 있습니다.
여기에서 재형성 이 유용합니다.
예를 들어 다음 그림을 생각해 보십시오. 6개의 요소로 구성된 1차원 배열인 벡터가 있습니다. 그리고 우리는 그것을 2×3, 3×2, 6×1 등의 형태로 배열할 수 있습니다.

️ 이 튜토리얼의 예제를 따르려면 Python과 NumPy가 설치되어 있어야 합니다. NumPy가 아직 없다면 NumPy 설치 가이드를 확인하세요.
이제 import numpy as np
를 실행하여 np
별칭으로 NumPy를 가져올 수 있습니다.
다음 섹션에서 구문을 배우도록 합시다.
NumPy reshape() 구문
NumPy reshape()를 사용하는 구문은 다음과 같습니다.
np.reshape(arr, newshape, order = 'C'|'F'|'A')
- arr 은 유효한 NumPy 배열 객체입니다. 여기에서 재구성할 배열입니다.
- newshape 는 새 배열의 모양입니다. 정수 또는 튜플일 수 있습니다.
- newshape 가 정수인 경우 반환된 배열은 1차원입니다.
- order 는 재구성할 배열의 요소를 읽고자 하는 순서를 나타냅니다.
- 기본값은 'C'이며, 이는 원래 배열의 요소가 C와 같은 인덱싱 순서(0부터 시작)로 읽히는 것을 의미합니다.
- 'F' 는 Fortran과 유사한 인덱싱(1부터 시작)을 나타냅니다. 그리고 'A' 는 배열 arr 의 메모리 레이아웃에 따라 C와 같은 또는 Fortran과 같은 순서로 요소를 읽습니다.
그렇다면
np.reshape()
는 무엇을 반환합니까?가능한 경우 원래 배열의 모양이 변경된 보기 를 반환합니다. 그렇지 않으면 배열의 복사본 을 반환합니다.
위의 줄에서 우리는 NumPy reshape()
가 가능할 때마다 뷰 를 반환하려고 한다고 언급했습니다. 그렇지 않으면 복사본 을 반환합니다. 계속해서 보기와 사본의 차이점에 대해 논의해 보겠습니다.
NumPy 배열의 보기와 복사본 비교
이름에서 알 수 있듯이 copy 는 원래 배열의 복사본입니다. 복사본에 대한 변경 사항은 원본 어레이 에 영향을 미치지 않습니다 .
반면에 보기 는 단순히 원래 배열의 모양이 변경된 보기를 나타냅니다. 즉, 뷰에 대한 변경 사항은 원래 배열에도 영향을 미치며 그 반대의 경우도 마찬가지입니다.
NumPy reshape()를 사용하여 1D 배열을 2D 배열로 변경
#1. np.arange()를 사용하여 샘플 배열을 만드는 것으로 시작하겠습니다.
arr1이라고 하는 1에서 12까지의 12개 숫자 배열이 필요합니다. NumPy arange() 함수는 기본적으로 끝점을 제외하므로 중지 값을 13으로 설정합니다.
이제 위의 구문을 사용하고 12개의 요소가 있는 arr1
을 모양(4,3)의 2D 배열로 모양을 바꾸겠습니다. 4개의 행과 3개의 열이 있는 이 arr2
를 호출해 보겠습니다.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2 = np.reshape(arr1,(4,3)) print("\nReshaped array:") print(arr2)
원래 배열과 모양이 변경된 배열을 살펴보겠습니다.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]
배열을 인수
np.reshape()
로 전달하는 대신 원래 배열에서.reshape()
메서드를 호출할 수도 있습니다.
dir(arr1)
을 실행하면 배열 객체 arr1
에서 사용할 수 있는 모든 가능한 메서드와 속성이 나열됩니다.
dir(arr1) # Output [ ... ... 'reshape' ... .. ]
위의 코드 셀에서 .reshape()
가 기존 NumPy 배열 arr1
에서 사용할 수 있는 유효한 메서드임을 알 수 있습니다.
️ 따라서 다음과 같은 단순화된 구문을 사용하여 NumPy 배열을 재구성할 수도 있습니다.
arr.reshape(d0,d1,...,dn) # where: # d0, d1,..,dn are the dimensions of the reshaped array # d0 * d1 * ...* dn = N, the number of elements in arr
이 자습서의 나머지 부분에서는 예제에서 이 구문을 사용하겠습니다.
#2. 12개 요소를 가진 벡터를 12 x 1 배열로 재구성해 보겠습니다.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3 = arr1.reshape(12,1) print("\nReshaped array:") print(arr3)
아래 출력에서 배열이 필요에 따라 모양이 변경된 것을 볼 수 있습니다.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10] [11] [12]]
그렇다면 사본이나 보기를 얻었는지 어떻게 확인합니까?
이를 확인하기 위해 반환된 배열에서 base
속성을 호출할 수 있습니다.
- 배열이 복사본인 경우
base
속성은None
입니다. - 배열이 뷰인 경우
base
속성은 원래 배열이 됩니다.
빠르게 확인해보자.
arr3.base # Output array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
보시다시피, arr3
의 base
속성은 원래 배열을 반환합니다. 이것은 우리가 원래 배열의 보기 를 받았다는 것을 의미합니다.

#삼. 이제 벡터를 다른 유효한 2 x 6 배열로 변형해 보겠습니다.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr4 = arr1.reshape(2,6) print("\nReshaped array:") print(arr4)
출력은 다음과 같습니다.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12]]
다음 섹션에서는 arr1
을 3D 배열로 변형해 보겠습니다.
NumPy reshape()를 사용하여 1D 배열을 3D 배열로 변경
arr1
을 3D 배열로 변형하려면 원하는 차원을 (1, 4, 3)으로 설정합니다.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr3D = arr1.reshape(1,4,3) print("\nReshaped array:") print(arr3D)
이제 원래 배열 arr1
과 동일한 12개 요소가 있는 3D 배열을 만들었습니다.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] Reshaped array: [[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]]
재구성 중 값 오류를 디버그하는 방법
구문을 기억하면 차원의 곱이 배열의 요소 수와 같을 때만 형태 변경이 유효합니다.
import numpy as np arr1 = np.arange(1,13) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr2D = arr1.reshape(4,4) print("\nReshaped array:") print(arr2D)
여기에서는 12개 요소 배열을 16개 요소가 있는 4x4 배열로 변형하려고 합니다. 인터프리터는 아래와 같이 값 오류를 발생시킵니다.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12] ----------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-11-63552bcc8c37> in <module>() 6 7 # Reshape array ----> 8 arr2 = arr1.reshape(4,4) 9 print("\nReshaped array:") 10 print(arr2) ValueError: cannot reshape array of size 12 into shape (4,4)
이러한 오류를 방지하려면 -1 을 사용하여 전체 요소 수를 기반으로 차원 중 하나의 모양을 자동으로 추론할 수 있습니다.
예를 들어, n – 1차원을 미리 알고 있다면 -1을 사용하여 재구성된 배열에서 n번째 차원을 추론할 수 있습니다.
24개 요소로 구성된 배열이 있고 이를 3D 배열로 변형하려는 경우. 3개의 행과 4개의 열이 필요하다고 가정합니다. 세 번째 차원을 따라 -1 값을 전달할 수 있습니다.
import numpy as np arr1 = np.arange(1,25) print("Original array, before reshaping:\n") print(arr1) # Reshape array arr_res = arr1.reshape(4,3,-1) print("\nReshaped array:") print(arr_res) print(f"Shape of arr_res:{arr_res.shape}")
모양 배열의 모양을 검사하면 모양이 변경된 배열의 3차원을 따라 모양이 2인 것을 알 수 있습니다.
Original array, before reshaping: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] Reshaped array: [[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]] [[13 14] [15 16] [17 18]] [[19 20] [21 22] [23 24]]] Shape of arr_res:(4, 3, 2)
이는 배열을 병합할 때 특히 유용합니다. 그리고 다음 섹션에서 이에 대해 배우게 될 것입니다.
NumPy reshape()를 사용하여 배열 병합
N차원 배열에서 평면 배열로 돌아가야 하는 경우가 있습니다. 이미지를 긴 픽셀 벡터로 병합하려고 한다고 가정합니다.
다음 단계를 사용하여 간단한 예제를 코딩해 보겠습니다.
- 픽셀이 0에서 255 사이인 3 x 3 회색조 이미지 배열
img_arr
을 생성합니다. - 다음으로 이
img_arr
을 평면화하고 평면화된 배열flat_arr
을 인쇄합니다. - 또한
img_arr
및flat_arr
의 모양을 출력하여 확인합니다.
img_arr = np.random.randint(0, 255, (3,3)) print(img_arr) print(f"Shape of img_arr: {img_arr.shape}") flat_arr = img_arr.reshape(-1) print(flat_arr) print(f"Shape of flat_arr: {flat_arr.shape}")
다음은 출력입니다.
[[195 145 77] [ 63 193 223] [215 43 36]] Shape of img_arr: (3, 3) [195 145 77 63 193 223 215 43 36] Shape of flat_arr: (9,)
위의 코드 셀에서 flat_arr
은 9개의 요소가 있는 픽셀 값의 1D 벡터임을 알 수 있습니다.
합산
배운 내용을 빠르게 검토할 때입니다.
- np.reshape(arr, newshape) 를 사용하여 arr 을 newshape 에 지정된 모양으로 변경합니다. newshape 는 재구성된 배열의 차원을 지정하는 튜플입니다.
- 또는 arr.reshape(d0, d1, …, dn) 을 사용하여 arr 을 d0 x d1 x … x dn 모양으로 변경합니다.
- d0 * d1 * …* dn = N , 원래 배열의 요소 수인지 확인하여 재구성 중 값 오류를 방지합니다.
- 차원이 자동으로 유추되도록 하려면 새 모양에서 최대 하나의 차원에 대해 -1 을 사용합니다.
- 마지막으로 arr.reshape(-1) 를 사용하여 배열을 평면화할 수 있습니다.
이제 NumPy reshape() 사용 방법을 알았으므로 NumPy linspace() 함수가 어떻게 작동하는지 배우십시오.
원하는 경우 Jupyter 노트북에서 코드 예제를 사용해 볼 수 있습니다. 다른 개발 환경을 찾고 있다면 Jupyter 대안에 대한 가이드를 확인하세요.