파이썬에서 2차원 배열을 3차원 배열로 N번 복사하는 방법
해결 방법:
다음은 2차원 배열을 3차원 배열로 N번 복사하는 방법입니다.
np.repeat 함수 사용:
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = np.repeat(arr[:, :, np.newaxis], 3, axis=2)
print(arr_3d)
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
설명:
np.repeat
함수는 배열을 특정 축에 따라 N번 반복합니다.[:, :, np.newaxis]
는 2차원 배열의 각 열에 새로운 차원을 추가합니다.axis=2
는 3번째 축에 따라 배열을 반복합니다.
for 루프 사용:
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = []
for i in range(3):
arr_3d.append(arr)
arr_3d = np.array(arr_3d)
print(arr_3d)
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
for
루프를 사용하여 2차원 배열을 N번 복사합니다.- 각 반복에서 2차원 배열을 3차원 배열에 추가합니다.
np.tile 함수 사용:
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = np.tile(arr[np.newaxis, :, :], (3, 1, 1))
print(arr_3d)
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
np.tile
함수는 배열을 특정 횟수만큼 반복합니다.[np.newaxis, :, :]
는 2차원 배열의 첫 번째 축에 새로운 차원을 추가합니다.(3, 1, 1)
은 3번째 축에 3번, 2번째 축에 1번, 1번째 축에 1번 배열을 반복합니다.
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = np.stack([arr, arr, arr], axis=2)
print(arr_3d)
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
np.stack
함수는 배열을 특정 축에 따라 연결합니다.
참고:
- 위의 방법들은 모두 동일한 결과
예제 코드
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 방법 1: np.repeat 함수 사용
arr_3d_1 = np.repeat(arr[:, :, np.newaxis], 3, axis=2)
# 방법 2: for 루프 사용
arr_3d_2 = []
for i in range(3):
arr_3d_2.append(arr)
arr_3d_2 = np.array(arr_3d_2)
# 방법 3: np.tile 함수 사용
arr_3d_3 = np.tile(arr[np.newaxis, :, :], (3, 1, 1))
# 방법 4: np.stack 함수 사용
arr_3d_4 = np.stack([arr, arr, arr], axis=2)
# 출력
print(arr_3d_1)
print(arr_3d_2)
print(arr_3d_3)
print(arr_3d_4)
출력:
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
- 위 코드는 Python 3에서 실행되었습니다.
- 다른 버전의 Python에서는 코드가 작동하지 않을 수 있습니다.
대체 방법
np.expand_dims 함수 사용:
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = np.expand_dims(arr, axis=2)
arr_3d = np.repeat(arr_3d, 3, axis=2)
print(arr_3d)
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
np.expand_dims
함수는 배열에 새로운 차원을 추가합니다.
np.einsum 함수 사용:
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = np.einsum('ij,k->ijk', arr, np.ones(3))
print(arr_3d)
# [[[1 1 1]
# [2 2 2]
# [3 3 3]]
# [[1 1 1]
# [2 2 2]
# [3 3 3]]
# [[1 1 1]
# [2 2 2]
# [3 3 3]]]
np.einsum
함수는 Einstein 표기법을 사용하여 배열 연산을 수행합니다.ij,k->ijk
는 2차원 배열 (i, j)과 1차원 배열 (k)을 3차원 배열 (i, j, k)로 변환합니다.
직접 코딩:
import numpy as np
# 2차원 배열
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 3차원 배열 만들기
arr_3d = np.zeros((3, 2, 3))
for i in range(3):
arr_3d[i] = arr
print(arr_3d)
# [[[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]
# [[1 2 3]
# [4 5 6]]]
- 3차원 배열을 zeros로 초기화합니다.
사용할 방법 선택:
사용할 방법은 상황에 따라 다릅니다.
- 간단하고 빠른 방법:
np.repeat
함수 사용 - 더 많은 제어가 필요한 경우:
np.tile
또는np.stack
함수 사용 - 최적의 성능이 필요한 경우: 직접 코딩
python arrays numpy