numpy의 reshape 메소드는 데이터의 변경 없이 shape만 바꿉니다. 예제 프로그램 몇 개를 보면서 이해해 보도록 하겠습니다.

 


 먼저, 2번째 줄은 numpy 배열 [1, 2, 3, 4, 5, 6]을 생성합니다.

 

 A는 이렇게 그려질 겁니다. 4번째 줄에서 A.reshape((2, 3))이라고 되어 있는데요. 이는 A의 데이터는 바꾸지 않고 모양만 2행 3열짜리로 바꾸겠다는 의미입니다.

 

 

 2행 3열이면 위와 같이 그려집니다.

 

 

 실행 결과는 위와 같습니다. 또 다른 예제를 들어 보겠습니다.

 

 이것은 어떨까요? 2번째 줄까지 수행하면, 아래와 같은 넘파이 배열이 생성될 겁니다.

 

 그런데, reshape((2, 2, 2)) 라고 하였습니다. 그러면, 이것은 높이가 2이고, 세로가 2이고, 가로가 2인 모양으로 바꾸라는 의미입니다.

 

 

 그러면, 이렇게 바뀔 겁니다. 행 우선 방식으로 채운다면 이렇게 채워집니다.

 

 실행 결과는 위와 같습니다.

 

 

 그런데, order가 'F'인 경우에는 이야기가 달라집니다. 포트란은 행 우선이 아닌 열 우선 방식을 씁니다. 채우는 방식이 달라집니다.

 

 즉, [0][0][0]에 1을 넣고, 다음에 [0][0][1]에 접근하는 것이 행 우선이였다면, 열 우선은 [0][0][0] 다음에 [1][0][0]에 접근합니다. 즉, 진한 노란색 위치에 2가 들어갑니다.

 

 

 다음에 [0][1][0]에 3이 들어갑니다.

 

 

 그 다음에 [1][1][0]에 4가 들어갑니다. 실행 결과는 아래와 같습니다.

 

 

 1, 2, 3, 4, 5, 6, 7, 8이 어떤 순서대로 들어갔는지 보시면 됩니다. 행 우선과 열 우선 방식은 자료 구조 시간에 다루니, 익숙해 지시는 것이 좋습니다. C는 행 우선 방식입니다.

 


 reshape의 shape에 -1이 들어가면, unspecified된 값을 의미합니다. 즉, 특정되지 않은 값을 의미합니다.  불특정 다수 할 때 불특정을 의미합니다. 예제 프로그램을 봅시다.

 

 예를 들어, 4번째 줄은 행이 몇 개인지는 모르겠지만, 열이 2개인 행렬로 reshape를 하라는 의미입니다. 2번째 줄에 의해서, 넘파이 배열 [1, 2, 3, 4, 5, 6]이 생성됩니다. 6은 2x에서 x 값이 3이므로, 3행 2열로 reshape가 됩니다.

 

 

 실행 결과는 위와 같습니다. 이런 경우는 어떨까요?

 

 

 1행 6열짜리를 ?행 ?열로 모양을 바꾸려고 합니다.

 

 이 경우에는, ValueError가 뜹니다. 왜냐하면 1행 6열짜리는 1행 6열, 2행 3열, 3행 2열, 6행 1열 이렇게 다시 모양을 잡는 가짓수가 4가지나 있기 때문입니다.