Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy로 4차원·3차원 배열의 크로네커 곱(Kronecker Product) 구하기

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()을 활용하면 서로 다른 차원의 배열도 별도의 전처리 없이 간단하게 크로네커 곱을 계산할 수 있습니다.