티스토리 뷰
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]]
'파이썬 > Numpy' 카테고리의 다른 글
| [Numpy] numpy 요소별 연산, 브로드 캐스팅(Broadcasting) (7) | 2025.08.13 |
|---|---|
| [Numpy] random 난수 생성 (rand, randint, randn, normal,seed) (2) | 2025.08.06 |
| [Numpy] ndarray의 axis 축 개념 (2) | 2025.08.05 |
| [Numpy] Numpy 배열 ndarray 속성 (4) | 2025.08.04 |
| [Numpy] Numpy의 개요 및 설치 (0) | 2024.07.03 |
- Total
- Today
- Yesterday
- baekjoon
- 강의노트 정리
- 숏코딩
- 백준
- NumPy
- **kwargs
- 클래스 총 정리
- ndarray
- 파이썬
- ML Process
- *
- 로지스틱 회귀
- **
- sorted
- Sort
- 딥러닝
- 경사하강법
- 비용함수
- 머신러닝
- cnn
- 강화학습
- ML 종류
- Action spaces
- 손실함수
- *args
- ML 프로세스
- Andrew Ng
- 앤드류응
- ML
- python
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
