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

파이썬 NumPy tensordot()으로 차원이 다른 배열 간 텐서 내적 계산하기

NumPy의 np.tensordot() 함수는 두 개의 텐서 a와 b, 그리고 각각의 축을 지정하는 배열류 객체 쌍인 (a_axes, b_axes)를 인수로 받아, 지정된 축을 따라 a와 b의 요소(성분)들의 곱을 모두 합산한 결과를 반환합니다. 세 번째 인수는 하나의 음수가 아닌 정수형 스칼라 N으로도 지정할 수 있으며, 이 경우에는 a의 마지막 N개 차원과 b의 처음 N개 차원이 서로 대응되어 합산됩니다.

이 글에서는 서로 차원(차수)이 다른 두 배열 사이의 텐서 내적을 np.tensordot()으로 계산하는 방법을 단계별로 살펴보겠습니다.

단계별 구현 방법

1단계: 필요한 라이브러리 임포트

먼저 NumPy 라이브러리를 임포트합니다.

import numpy as np

2단계: 차원이 다른 두 배열 생성

array() 메서드를 사용하여 서로 다른 차원을 가진 두 개의 NumPy 배열을 생성합니다. 첫 번째 배열은 3차원(2×2×2) 정수 배열, 두 번째 배열은 2차원(2×2) 문자(object 타입) 배열입니다.

arr1 = np.array(range(1, 9))
arr1.shape = (2, 2, 2)

arr2 = np.array(('p', 'q', 'r', 's'), dtype=object)
arr2.shape = (2, 2)

3단계: 배열 출력하기

생성한 두 배열을 화면에 출력합니다.

print("Array1...\n",arr1)
print("\nArray2...\n",arr2)

4단계: 배열의 차원 확인

ndim 속성으로 두 배열의 차원 수를 확인합니다.

print("\nDimensions of Array1...\n",arr1.ndim)
print("\nDimensions of Array2...\n",arr2.ndim)

5단계: 배열의 형태(shape) 확인

shape 속성으로 두 배열의 형태를 확인합니다.

print("\nShape of Array1...\n",arr1.shape)
print("\nShape of Array2...\n",arr2.shape)

6단계: 텐서 내적 계산

차원이 다른 배열들에 대한 텐서 내적을 계산하려면 numpy.tensordot() 메서드를 사용합니다. 여기서는 arr1의 0번·1번 축과 arr2의 0번·1번 축을 각각 대응시켜 곱의 합을 구합니다.

print("\nTensor dot product...\n", np.tensordot(arr1, arr2, ((0, 1), (0, 1))))

전체 예제 코드

import numpy as np

# array() 메서드로 서로 다른 차원을 가진 두 개의 NumPy 배열 생성
arr1 = np.array(range(1, 9))
arr1.shape = (2, 2, 2)
arr2 = np.array(('p', 'q', 'r', 's'), dtype=object)
arr2.shape = (2, 2)

# 배열 출력
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)

# numpy.tensordot()으로 차원이 다른 배열들의 텐서 내적 계산
print("\nTensor dot product...\n", np.tensordot(arr1, arr2, ((0, 1), (0, 1))))

실행 결과

Array1...
[[[1 2]
[3 4]]

[[5 6]
[7 8]]]

Array2...
[['p' 'q']
['r' 's']]

Dimensions of Array1...
3

Dimensions of Array2...
2

Shape of Array1...
(2, 2, 2)

Shape of Array2...
(2, 2)

Tensor dot product...
['pqqqrrrrrsssssss' 'ppqqqqrrrrrrssssssss']

결과 해설

arr2는 object 타입의 문자 배열이므로, 곱셈 연산이 수행될 때 파이썬 객체의 특성에 따라 정수와 문자의 곱은 문자 반복으로 처리됩니다. 예를 들어 첫 번째 결과 값은 1×'p' + 3×'q' + 5×'r' + 7×'s'가 계산되어 'p' + 'qqq' + 'rrrrr' + 'sssssss'가 누적된 'pqqqrrrrrsssssss'가 됩니다. 두 번째 값 역시 같은 원리로 2×'p' + 4×'q' + 6×'r' + 8×'s'가 반영된 'ppqqqqrrrrrrssssssss'입니다.

이처럼 np.tensordot()은 배열의 차원이 서로 달라도, 합산할 축만 올바르게 지정해 주면 유연하게 텐서 내적을 계산할 수 있습니다.