티스토리 뷰

numpy 데이터를 좀 더 효과적으로 처리하는 방법에 대해 알아보자.

 

 

🔎reshape()

배열의 형태(차원)을 변경할 수 있게 해주는 함수이다.

굉장히 크거나 외부 데이터를 다루는 경우, 데이터 처리를 용이하게 하기 위해 모양을 바꾸는 경우에 사용한다.

arr = np.arange(10)
print(arr) # [0 1 2 3 4 5 6 7 8 9]

arr = arr.reshape(2,5)
print(arr) #[[0 1 2 3 4]
           # [5 6 7 8 9]]

arr = arr.reshape(5,2)
print(arr) # [[0 1]
           #  [2 3]
           #  [4 5]
           #  [6 7]
           #  [8 9]]

 

위의 코드와 같이 하나하나 값을 넣어줘야 한다.

 

그런데, 외부 데이터의 경우 배열으의 크기를 정확하게 알 수 없다면, 어떻게 해야할까?

그때 사용하는 것이 reshape(-1)이다.

 

reshape에서 -1의 의미

-1은 차원을 자동으로 계산해 달라는 뜻이다.

전체 원소 수가 맞는 한에서, -1이 위치한 곳은 자동 계산이 된다.

arr = np.arange(12)
print(arr) # [0 1 2 3 4 5 6 7 8 9 10 11]

arr = arr.reshape(-1,3) 
print(arr)   #[[ 0  1  2]
             # [ 3  4  5]
             # [ 6  7  8]
             # [ 9 10 11]]

arr = arr.reshape(6, -1)
print(arr)   #[[ 0  1]
             # [ 2  3]
             # [ 4  5]
             # [ 6  7]
             # [ 8  9]
             # [10 11]]

 

아래는 reshape(-1)만 사용할 경우, 배열을 1차원 형태로 만들어준다.

여기서 주의할 점은 모양은 x.reshape(1,-1)과 같으나 차원수가 다르다.

arr = np.arange(12)

arr = arr.reshape(-1)
print(arr)   #[ 0  1  2  3  4  5  6  7  8  9 10 11]

arr = arr.reshape(1, -1)
print(arr)   #[[ 0  1  2  3  4  5  6  7  8  9 10 11]]

 

reshape을 사용하면 장점은 다양한 상황에서 배열의 크기에 따라 자동적으로 모양을 맞추어주는 기능을 수행한다.

a = np.arange(16)

a_4_x = a.reshape((4,3))	# 오타, error

a_4_x = a.reshape((4,-1))	# 역시! 실수가 없네
print(a_4_x.shape)	# (4, 4)

 

 

🔎flatten() 

 다차원의 배열을 1차원 벡터로 납작하게(flatten)하게 만들어주는 함수이다.

arr = np.arange(30).reshape(2, 3, 5)

print(arr.flatten())
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14
#  15 16 17 18 19 20 21 22 23 24 25 26 27 28 29]

 

 

🔎copy(): 깊은 복사 (Deep Copy)

원본과 완전히 독립된 새로운 메모리 공간을 생성해 복사한다.

즉, 원본 데이터를 변경해도 복사본에 영향을 주지 않는다.

a = np.arange(5)
b = a.copy()
b[0] = 100

print(a)  # [0 1 2 3 4]
print(b)  # [100   1   2   3   4]

 

🔎view(): 얕은 복사 (Shallow Copy)

원본 데이터의 메모리를 공유하여 복사한다.

즉, 복사본을 수정하면 원본 데이터도 함께 변경된다.

a = np.arange(5)
b = a.view()    # 기존의 Memory 사용

b[0] = 100

print(a)    # [100   1   2   3   4]
print(b)    # [100   1   2   3   4]

 

.base 속성으로 확인 가능

ndarray.base 속성을 사용하면 해당 배열이 다른 배열에서 파생되었는지 확인 할 수 있다.

a = np.arange(4)
b = a.reshape((2, 2))
c = a.copy()
d = a.view()
e = a[0:3]      # view()와 동일

print(b.base is a)  # True (view)
print(c.base is a)  # False (copy)
print(d.base is a)  # True (view)
print(e.base is a)  # True (view)
print(a.base is None)  # True (원본)

 

reshape()도 기본적으로 view()로, 얕은 복사이다.

a = np.arange(4)
b = np.reshape(a, (2,2))

b[0,0] = 100

print(b.base is a, '\n')    # True
print(a)    # [100   1   2   3]
print(b)    # [[100   1]
            # [  2   3]]

 

원본 변경을 막고 싶다면, .copy()와 함께 사용하기!

a = np.arange(4)
b = np.reshape(a, (2,2)).copy()

b[0, 0] = 100

print(b.base is a, '\n')    # False
print(a)    # [0 1 2 3]
print(b)    # [[100   1]
            # [  2   3]]

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함