Python에서 4차원(4D) 배열과 3차원(3D) 배열의 크로네커 곱(Kronecker product)을 계산하려면 numpy.kron() 메서드를 사용하면 됩니다. 크로네커 곱은 첫 번째 배열의 각 요소로 두 번째 배열을 스케일링한 블록들로 구성된 복합 배열입니다.
크로네커 곱의 동작 원리
numpy.kron() 함수는 두 배열 a와 b의 차원 수가 같다고 가정하며, 차원 수가 다를 경우에는 더 작은 쪽 앞에 길이가 1인 축을 추가해 맞춥니다.
만약 a.shape = (r0, r1, ..., rN)이고 b.shape = (s0, s1, ..., sN)이라면, 크로네커 곱 결과의 형태(shape)는 다음과 같습니다.
(r0*s0, r1*s1, ..., rN*sN)
결과 배열의 각 요소는 a와 b의 요소들의 곱으로, 아래 규칙에 따라 명시적으로 배치됩니다.
kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN]
단계별 구현 방법
1단계: 라이브러리 임포트
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
2단계: 서로 다른 차원의 배열 생성
arange()와 reshape() 메서드를 사용해 서로 다른 차원을 가진 두 개의 NumPy 배열을 만듭니다.
arr1 = np.arange(40).reshape((2,5,2,2)) arr2 = np.arange(18).reshape((2,3,3))
3단계: 배열 출력 및 속성 확인
생성한 두 배열과 각각의 차원 수(ndim), 형태(shape)를 확인합니다.
print("Array1...\n", arr1)
print("\nArray2...\n", arr2)
print("\nDimensions of Array1...\n", arr1.ndim)
print("\nDimensions of Array2...\n", arr2.ndim)
print("\nShape of Array1...\n", arr1.shape)
print("\nShape of Array2...\n", arr2.shape)4단계: 크로네커 곱 계산
numpy.kron() 메서드를 호출하여 두 배열의 크로네커 곱을 구합니다.
print("\nResult (Kronecker product)...\n", np.kron(arr1, arr2))전체 예제 코드
import numpy as np
# arange()와 reshape() 메서드로 서로 다른 차원의 두 배열 생성
arr1 = np.arange(40).reshape((2,5,2,2))
arr2 = np.arange(18).reshape((2,3,3))
# 배열 출력
print("Array1...\n", arr1)
print("\nArray2...\n", arr2)
# 두 배열의 차원 수 확인
print("\nDimensions of Array1...\n", arr1.ndim)
print("\nDimensions of Array2...\n", arr2.ndim)
# 두 배열의 형태(shape) 확인
print("\nShape of Array1...\n", arr1.shape)
print("\nShape of Array2...\n", arr2.shape)
# numpy.kron() 메서드로 두 배열의 크로네커 곱 계산
print("\nResult (Kronecker product)...\n", np.kron(arr1, arr2))실행 결과
위 코드를 실행하면 다음과 같은 정보가 출력됩니다.
Array1... [[[[ 0 1] [ 2 3]]] [[[ 4 5] [ 6 7]]] ... 중략 ... [[[36 37] [38 39]]]] Array2... [[[ 0 1 2] [ 3 4 5] [ 6 7 8]] [[ 9 10 11] [12 13 14] [15 16 17]]] Dimensions of Array1... 4 Dimensions of Array2... 3 Shape of Array1... (2, 5, 2, 2) Shape of Array2... (2, 3, 3)
크로네커 곱의 결과는 매우 큰 배열이므로 일부만 발췌하면 다음과 같습니다.
Result (Kronecker product)... [[[[ 0 0 0 0 1 2] [ 0 0 0 3 4 5] [ 0 0 0 6 7 8] [ 0 2 4 0 3 6] [ 6 8 10 9 12 15] [12 14 16 18 21 24]] [[ 0 0 0 9 10 11] [ 0 0 0 12 13 14] [ 0 0 0 15 16 17] [18 20 22 27 30 33] [24 26 28 36 39 42] [30 32 34 45 48 51]] ... 이하 생략 ...
정리
이 예제에서 첫 번째 배열은 형태가 (2, 5, 2, 2)인 4차원 배열, 두 번째 배열은 형태가 (2, 3, 3)인 3차원 배열입니다. numpy.kron()은 자동으로 차원 수를 맞춘 뒤 각 축의 크기를 곱한 (2, 10, 6, 6) 형태의 결과 배열을 반환합니다. 이처럼 numpy.kron()을 활용하면 서로 다른 차원의 배열도 별도의 전처리 없이 간단하게 크로네커 곱을 계산할 수 있습니다.