지난번 포스팅에서는 배열을 합치는 API들에 대해 알아봤는데요,
이번 포스팅에서는 배열을 반복하는 API들에 대해 알아보도록 하겠습니다.
np.repeat()
np.repeat(a, repeats, axis)
ndarray.repeat(repeats, axis)
a = 3
b = np.array([1, 2, 3])
rep_a = np.repeat(a, 2)
rep_b = np.repeat(b, 3)
print(rep_a)
# [3 3]
print(rep_b)
# [1 1 1 2 2 2 3 3 3]
np.repeat() 메서드를 사용하면 배열을 원소별로 반복합니다.
a = np.arange(4).reshape(2, 2)
print(a)
# [[0 1]
# [2 3]]
rep = np.repeat(a, 3)
print(rep)
# [0 0 0 1 1 1 2 2 2 3 3 3]
매개변수 axis의 값을 전달하지 않으면 1차원 벡터로 인식합니다.
a = np.arange(4).reshape(2, 2)
print(a)
# [[0 1]
# [2 3]]
rep_0 = np.repeat(a, repeats=3, axis=0)
print(rep_0)
# [[0 1]
# [0 1]
# [0 1]
# [2 3]
# [2 3]
# [2 3]]
rep_1 = np.repeat(a, repeats=3, axis=1)
print(rep_1)
# [[0 0 0 1 1 1]
# [2 2 2 3 3 3]]
2차원 배열에 대해 np.repeat() 메서드를 실행하는 경우입니다.
- axis=0: 배열 내 원소를 행별로 반복합니다.
- axis=1: 배열 내 원소를 열별로 반복합니다.
위 예제 코드는 배열의 각 원소를 행과 열별로 3번 반복합니다.
# 행별로 반복하는 경우 (repeats에 리스트 전달)
a = np.arange(4).reshape(2, 2)
print(a)
# [[0 1]
# [2 3]]
rep = np.repeat(a, repeats=[2, 1], axis=0)
print(rep)
# [[0 1]
# [0 1]
# [2 3]]
# 열별로 반복하는 경우 (repeats에 리스트 전달)
a = np.arange(6).reshape(2, 3)
print(a)
# [[0 1 2]
# [3 4 5]]
rep = np.repeat(a, repeats=[2, 1, 2], axis=1)
print(rep)
# [[0 0 1 2 2]
# [3 3 4 5 5]]
매개변수 repeats의 값으로 리스트를 전달하는 위 예제 코드를 살펴보겠습니다.
우선 배열의 원소를 행별로 반복하는 경우(axis=0)입니다.
첫 번째 원소는 2번, 두 번째 원소는 1번 반복합니다.
따라서 기존 배열의 형태가 (2, 2)에서 (3, 2)로 변합니다.
다음으로는 배열의 원소를 열별로 반복하는 경우(axis=1)입니다.
첫 번째 원소는 2번, 두 번째 원소는 1번, 마지막 원소는 2번 반복합니다.
그 결과 기존 배열의 형태가 (2, 3)에서 (2, 5)로 변합니다.
# 📍 행벡터를 반복
row_vec = np.arange(4).reshape(1, -1)
print(row_vec.shape)
# (1, 4)
print(row_vec)
# [[0 1 2 3]]
rep = np.repeat(row_vec, repeats=3, axis=0)
print(rep.shape)
# (3, 4)
print(rep)
# [[0 1 2 3]
# [0 1 2 3]
# [0 1 2 3]]
# 📍 열벡터를 반복
col_vec = np.arange(4).reshape(-1, 1)
print(col_vec.shape)
# (4, 1)
print(col_vec)
# [[0]
# [1]
# [2]
# [3]]
rep = np.repeat(col_vec, repeats=3, axis=1)
print(rep.shape)
# (4, 3)
print(rep)
# [[0 0 0]
# [1 1 1]
# [2 2 2]
# [3 3 3]]
주로 2차원 배열 형태의 행벡터와 열벡터를 반복할 때 사용합니다.
np.tile()
np.tile(a, reps)
a = np.arange(4)
print(a)
# [0 1 2 3]
tile = np.tile(a, reps=3)
print(tile)
# [0 1 2 3 0 1 2 3 0 1 2 3]
np.tile() 메서드를 사용하면 배열 전체를 반복합니다.
a = np.arange(3)
print(a)
# [0 1 2]
tile1 = np.tile(a, reps=[1, 2])
print(tile1.shape)
# (1, 6)
print(tile1)
# [[0 1 2 0 1 2]]
tile2 = np.tile(a, reps=[2, 1])
print(tile2.shape)
# (2, 3)
print(tile2)
# [[0 1 2]
# [0 1 2]]
tile3 = np.tile(a, reps=[2, 2])
print(tile3.shape)
# (2, 6)
print(tile3)
# [[0 1 2 0 1 2]
# [0 1 2 0 1 2]]
매개변수 reps의 값으로 리스트를 전달할 수 있습니다.
리스트 내 원소는 각 axis별 반복 횟수를 의미합니다.
a = np.arange(6).reshape(2, 3)
print(a.shape)
# (2, 3)
print(a)
# [[0 1 2]
# [3 4 5]]
tile1 = np.tile(a, reps=[1, 2])
print(tile1.shape)
# (2, 6)
print(tile1)
# [[0 1 2 0 1 2]
# [3 4 5 3 4 5]]
tile2 = np.tile(a, reps=[2, 1])
print(tile2.shape)
# (4, 3)
print(tile2)
# [[0 1 2]
# [3 4 5]
# [0 1 2]
# [3 4 5]]
tile3 = np.tile(a, reps=[2, 2])
print(tile3.shape)
# (4, 6)
print(tile3)
# [[0 1 2 0 1 2]
# [3 4 5 3 4 5]
# [0 1 2 0 1 2]
# [3 4 5 3 4 5]]
2차원 배열(행렬)을 반복하는 경우입니다.
# 📍 행벡터를 반복
a = np.arange(4).reshape(1, -1)
print(a.shape)
# (1, 4)
tile1 = np.tile(a, reps=[5, 1])
print(tile1.shape)
# (5, 4)
# 📍 열벡터를 반복
b = np.arange(4).reshape(-1, 1)
print(a.shape)
# (1, 4)
tile2 = np.tile(b, reps=[1, 5])
print(tile2.shape)
# (4, 5)
2차원 배열 형태의 행벡터와 열벡터를 반복하는 경우입니다.
정리를 마치며
이상으로 넘파이 배열을 반복하는 두 가지 메서드에 대해 알아봤습니다.
자주 사용하는 API는 아니지만 np.repeat()과 np.tile() 메서드가 동작하는 방식의 차이점을 중심으로 알고 있으면 좋을 것 같습니다.
'파이썬・ML > numpy' 카테고리의 다른 글
| 넘파이 배열의 생성법과 기본 속성 이해하기 (0) | 2023.07.27 |
|---|---|
| 넘파이 배열 shape 속성에 대한 이해 (0) | 2023.07.27 |
| 넘파이 np.hstack(), np.vstack(), np.concatenate() 배열 합치기 (0) | 2023.06.16 |
| 넘파이 배열의 차원 다루기 (0) | 2023.06.15 |
| 넘파이 벡터의 내적과 행렬의 곱셈 (0) | 2023.06.15 |