상위 목록: 하위 목록: 작성 날짜: 읽는 데 2 분 소요

리쉐이프

import numpy as np

a = np.array([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]])

print(a)
print(np.shape(a))
a.shape = (6,2)
print(a)
결과
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
(3, 4)
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]

배열.shape = (행, 열)을 통하여 배열의 형태를 변환할 수 있습니다.

변환할 형태의 행과 열의 곱은 원본 배열의 원소 개수와 같아야합니다.

원본 배열의 크기가 3x4=12일 경우, 리쉐이프 할때 6x2=12로 총 개수와 동일해야합니다.


import numpy as np

a = np.array([[[1, 2, 3], [4, 5, 6]],
              [[7, 8, 9], [10, 11, 12]],
              [[13, 14, 15], [16, 17, 18]]])

print(a)
print(np.shape(a))
a.shape = (2, 3, 3)
print(a)
결과
[[[ 1 2 3]
[ 4 5 6]]

[[ 7 8 9]
[10 11 12]]

[[13 14 15]
[16 17 18]]]
(3, 2, 3)
[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]

[[10 11 12]
[13 14 15]
[16 17 18]]]

3차원 이상의 배열 또한 형태를 변환할 수 있습니다.

배열.shape= (페이지, 행, 열)의 순서이며, 역시 총 길이의 개수와 동일해야합니다.

  • Tip : 배열.shape에 값을 대입하는 방식은 원본 배열 자체의 형태를 변경합니다. 이 방식은 NumPy 2.5부터 사용이 권장되지 않으며(DeprecationWarning), 아래의 reshape를 사용하는 것이 좋습니다.



reshape 함수

import numpy as np

a = np.arange(12)

b = a.reshape(3, 4)
c = np.reshape(a, (2, -1))
d = a.reshape(-1, 6)

print(b)
print(c)
print(d.shape)
결과
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]
[[ 0 1 2 3 4 5]
 [ 6 7 8 9 10 11]]
(2, 6)

배열.reshape(형태) 또는 np.reshape(배열, 형태)를 사용하여 형태가 변경된 새로운 배열을 반환할 수 있습니다. 배열.shape에 대입하는 방식과 달리 원본 배열의 형태는 변경되지 않습니다.

형태에 -1을 입력할 경우, 나머지 차원과 원소 개수를 이용해 해당 차원의 크기를 자동으로 계산합니다.

12개의 원소를 (2, -1)로 변환하면 -1은 12 / 2 = 6으로 계산되며, -1은 하나의 차원에만 사용할 수 있습니다.

  • Tip : reshape 함수는 order 매개변수로 원소를 읽고 배치하는 순서를 지정할 수 있습니다. 기본값은 'C'(행 우선)이며, 자세한 내용은 13강 - 메모리 레이아웃에서 다룹니다.



리쉐이프와 뷰

import numpy as np

a = np.arange(6)
b = a.reshape(2, 3)

b[0, 0] = 99

print(a)
print(np.shares_memory(a, b))
결과
[99 1 2 3 4 5]
True

reshape는 가능한 경우 데이터를 복사하지 않고 원본과 데이터를 공유하는 뷰(View)를 반환합니다.

그러므로, 리쉐이프된 배열의 값을 변경하면 원본 배열의 값도 함께 변경됩니다. 원본과 독립적인 배열이 필요하다면 배열.reshape(형태).copy()를 사용합니다.



1차원 배열로 펼치기

import numpy as np

a = np.array([
    [1, 2, 3],
    [4, 5, 6]])

r = a.ravel()
f = a.flatten()

r[0] = 99
f[1] = -1

print(a)
print(r)
print(f)
결과
[[99 2 3]
 [ 4 5 6]]
[99 2 3 4 5 6]
[ 1 -1 3 4 5 6]

다차원 배열을 1차원 배열로 펼칠 때는 배열.ravel() 또는 배열.flatten()을 사용합니다.

ravel()은 가능한 경우 뷰를 반환하므로 값을 변경하면 원본도 변경되며, flatten()은 항상 복사본을 반환하므로 원본에 영향을 주지 않습니다.

  • Tip : 배열.reshape(-1)도 ravel()과 동일하게 1차원 배열을 반환합니다.

댓글 남기기