Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで異なる次元の配列同士のテンソル内積を計算する方法(numpy.tensordot)

2つのテンソル ab、および (a_axes, b_axes) の形式で軸の対応を指定するオブジェクトが与えられたとき、テンソル内積(テンソルドット積)では、指定された軸に沿って ab の要素(成分)の積を合計します。第3引数には単一の非負整数 N を指定することもでき、その場合は a末尾の N 個の軸と、b先頭の N 個の軸が順に縮約(sum over)されます。

numpy.tensordot() メソッドとは

異なる次元(ndim)を持つ配列同士のテンソル内積を計算するには、Python の numpy.tensordot() メソッドを使用します。

  • a, b:ドット演算を行う対象となるテンソル(配列)
  • axes:整数 N を指定すると、a の最後の N 個の軸と b の最初の N 個の軸が順に縮約されます。このとき、対応する軸のサイズは一致している必要があります。省略した場合のデフォルト値は 2 です。

計算の手順

1. 必要なライブラリをインポートする

import numpy as np

2. 異なる次元の2つの配列を作成する

array() メソッドを使って、3次元配列と2次元配列を作成します。

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)を確認する

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

6. テンソル内積を計算する

numpy.tensordot() メソッドを使って、異なる次元の配列同士のテンソル内積を計算します。

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

完全なコード例

import numpy as np

# array()メソッドで異なる次元の2つの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))

実行結果

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...
['pqqrrrssss' 'pppppqqqqqqrrrrrrrssssssss']

結果の解説

この例では axes を省略しているため、デフォルトの N=2 が適用されます。つまり、arr1(形状 (2, 2, 2))の末尾2軸と、arr2(形状 (2, 2)) の先頭2軸が縮約されます。

具体的には、結果の各要素は次のように計算されています。

  • 1番目の要素:1×'p' + 2×'q' + 3×'r' + 4×'s''pqqrrrssss'
  • 2番目の要素:5×'p' + 6×'q' + 7×'r' + 8×'s''pppppqqqqqqrrrrrrrssssssss'

ここで arr2dtype=object の文字列配列のため、数値との掛け算が文字列の繰り返しとして処理され、その結果が連結されて表示されています。数値配列の場合は通常の数値の総和が得られます。縮約されなかった arr1 の残りの軸(サイズ2)がそのまま結果の軸になるため、出力は要素数2の配列となります。

  1. 【Python】numpy.inner()で2つの多次元配列の内積を計算する方法

    2つの多次元配列の内積(インナー積)を求めるには、Pythonのnumpy.inner()メソッドを使用します。このメソッドは、1次元配列に対しては通常のベクトルの内積を計算し、高次元配列に対しては最後の軸に沿った要素ごとの積の総和を返します。 引数として渡すのは a と b の2つの配列です。なお、aとbがスカラーでない場合は、両者の最後の軸のサイズが一致している必要があります。 内積を計算する手順 まず、必要なライブラリをインポートします。 import numpy as np array()メソッドを使って、2つのNumPyの2次元配列を作成します。 arr1 = np.array([[

  2. Python(NumPy)で4次元配列と3次元配列のクロネッカー積を計算する方法

    クロネッカー積(Kronecker Product)とは PythonのNumPyでは、numpy.kron()メソッドを使うことで、4次元配列と3次元配列のように次元数が異なる配列同士でもクロネッカー積を簡単に求めることができます。クロネッカー積とは、第1の配列の各要素によって第2の配列全体をスケーリングしたブロックから構成される複合配列のことです。 kron()関数は、引数aとbの次元数が同じであることを前提としており、次元数が異なる場合は、小さい方の配列の先頭にサイズ1の軸が自動的に追加されます。a.shape = (r0, r1, …, rN)、b.shape = (s0, s1, …