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

Pythonのnumpy.tensordot()で異なる次元の配列のテンソル内積を二重縮約により計算する方法

2つのテンソル a と b、および2つのarray_likeオブジェクト(a_axes, b_axes)を含むarray_likeオブジェクトが与えられた場合、a_axesとb_axesで指定された軸に沿って、aとbの要素(成分)の積が合計されます。第3引数には単一の非負の整数スカラー N を指定することもできます。その場合、a の最後の N 個の次元と b の最初の N 個の次元について総和が計算されます。

異なる次元を持つ配列同士のテンソルドット積を計算するには、Pythonの numpy.tensordot() メソッドを使用します。a と b は「ドット」演算の対象となるテンソルです。axes パラメータに整数 N を指定すると、a の最後の N 個の軸と b の最初の N 個の軸に対して順に総和が取られます。このとき、対応する軸のサイズは一致している必要があります。特に axes = 2 を指定すると、2組の軸を同時に縮約する「テンソルの二重縮約(ダブルコントラクション)」が実行されます。

手順

まず、必要なライブラリをインポートします。

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)

両方の配列の次元数(ndim)を確認します。

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.tensordot() メソッドを使用します。

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

完全なコード例

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)

# 異なる次元の配列同士のテンソルドット積を計算します
print("\nTensor dot product...\n", np.tensordot(arr1, arr2, axes = 2))

出力結果

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']

この例では、3次元配列 arr1(形状 2×2×2)と2次元配列 arr2(形状 2×2)に対して axes = 2 を指定しているため、arr1 の最後の2つの軸と arr2 の最初の2つの軸が同時に縮約され、二重縮約によるテンソルドット積が計算されます。なお、arr2 は dtype=object の文字列配列であるため、要素ごとの掛け算は文字列の繰り返しとして処理され、最終的な結果は連結された文字列になっています。

  1. 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, …

  2. Pythonで文字列変数を使って二重引用符(ダブルクォート)を出力する方法を徹底解説

    Pythonで文字列を出力する際、二重引用符(ダブルクォート)は文字列を囲むための構文の一部として使われるため、そのまま出力しようとするとエラーになってしまいます。この記事では、print文を使って二重引用符を正しく出力する方法を解説します。 うまくいかない例 まず、以下のようなコードでは二重引用符を出力できません。最初の2行は何も出力されず、最後の行はエラーが発生します。 print( ) print( ) print(aString) 出力結果 上記のコードを実行すると、次のようになります。 print(aString) ^ SyntaxError: invalid syntax この