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

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

NumPyのnumpy.tensordot()メソッドを使うと、2つのテンソル(多次元配列)のテンソル内積(テンソルドット積)を計算できます。このメソッドは、2つのテンソルaとb、そして2つのarray_likeオブジェクト(a_axes, b_axes)を含むarray_likeオブジェクトを受け取ります。指定された軸に沿って、aとbの要素(成分)の積を合計します。

第3引数には、単一の非負の整数スカラーNを指定することも可能です。その場合、aの最後のN個の次元とbの最初のN個の次元について和が計算されます。これにより、次元数が異なる配列同士でも柔軟にテンソル内積を求めることができます。

手順

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

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)

両方の配列の形状(shape)を確認します。

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

次元数の異なる配列同士のテンソル内積を計算するには、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()メソッドを使って、次元数の異なる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, ((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']

ポイントまとめ

  • np.tensordot(a, b, axes)は、axesで指定した軸に沿って要素ごとの積を合計し、新しいテンソルを返します。
  • axes引数には、((aの軸), (bの軸))のようにタプルで対応関係を指定できます。
  • 整数Nを渡すと、aの末尾N次元とbの先頭N次元が自動的に縮約されます。
  • 次元数や形状が異なる配列同士でも、軸のサイズが一致していれば計算可能です。
  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, …