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

【Python】numpy.linalg.tensorsolve()でテンソル方程式を解く方法

Pythonでテンソル方程式を解くには、numpy.linalg.tensorsolve()メソッドを使用します。この関数では、xのすべてのインデックスが積の中で総和されると仮定されます。これは、例えばtensordot(a, x, axes=b.ndim)のように、係数テンソルaの最も右側のインデックスとともに計算されることを意味します。

パラメータの説明

第1引数 a(係数テンソル):形状は b.shape + Q となります。ここでQはタプルであり、aの右端から適切な数のインデックスで構成される部分テンソルの形状を表します。また、prod(Q) == prod(b.shape) を満たす必要があります。

第2引数 b(右辺のテンソル):任意の形状を持つことができます。

第3引数 axis(軸の指定):逆行列を計算する前に、aの中で右側へ移動(並べ替え)する軸を指定します。None(デフォルト)の場合、並べ替えは行われません。

実装手順

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

import numpy as np

次に、array()メソッドを使って2つのNumPy配列を作成します。

arr1 = np.eye(2*3*4)
arr1.shape = (2*3, 4, 2, 3, 4)

arr2 = np.random.randn(2*3, 4)

作成した配列を表示して確認します。

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.linalg.tensorsolve()メソッドを呼び出します。

print("\nResult...\n",np.linalg.tensorsolve(arr1, arr2))

完全なコード例

import numpy as np

# array()メソッドを使って2つのNumPy配列を作成
arr1 = np.eye(2*3*4)
arr1.shape = (2*3, 4, 2, 3, 4)
arr2 = np.random.randn(2*3, 4)

# 配列を表示
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.linalg.tensorsolve()でテンソル方程式を解く
print("\nResult...\n",np.linalg.tensorsolve(arr1, arr2))

出力結果

arr1は単位行列を5次元テンソルに reshape したものであるため、出力は非常に長くなります。以下では主要な部分のみを抜粋して示します。

Array1...
[[[[[1. 0. 0. 0.]
   [0. 0. 0. 0.]
   [0. 0. 0. 0.]]

  [[0. 0. 0. 0.]
   [0. 0. 0. 0.]
   [0. 0. 0. 0.]]]

  [[[0. 1. 0. 0.]
   [0. 0. 0. 0.]
   [0. 0. 0. 0.]]

  ...(中略:単位行列の要素が対角位置に配置された構造が続く)...

  [[[0. 0. 0. 0.]
   [0. 0. 0. 0.]
   [0. 0. 0. 1.]]

  [[0. 0. 0. 0.]
   [0. 0. 0. 0.]
   [0. 0. 0. 0.]]]]]

Array2...
[[ 0.31376716  0.63443741  0.58628101  0.62313096]
 [ 1.12528958 -1.18403238 -0.64663325 -0.24241201]
 [ 0.55598965 -2.00059925 -1.97946414 -1.72478953]
 [ 0.18976226  0.60572953  1.50157692 -2.4491463 ]
 [ 0.42461806 -2.17872016  0.49677904 -1.11634625]
 [-1.09074462  0.35475618  0.42474987 -1.34391368]]

Dimensions of Array1...
5

Dimensions of Array2...
2

Shape of Array1...
(6, 4, 2, 3, 4)

Shape of Array2...
(6, 4)

Result...
[[[ 0.31376716  0.63443741  0.58628101  0.62313096]
  [ 1.12528958 -1.18403238 -0.64663325 -0.24241201]
  [ 0.55598965 -2.00059925 -1.97946414 -1.72478953]]

 [[ 0.18976226  0.60572953  1.50157692 -2.4491463 ]
  [ 0.42461806 -2.17872016  0.49677904 -1.11634625]
  [-1.09074462  0.35475618  0.42474987 -1.34391368]]]

このように、np.eye()で生成した単位行列ベースの係数テンソルに対してtensorsolve()を適用すると、右辺のテンソルbがそのまま解xとして得られます。これは、単位行列を係数とする連立方程式 Ax = b の解が x = b になることと同じ原理です。

  1. Pythonデバッガー(pdb)の使い方を徹底解説!基本コマンドからブレークポイントまで

    Pythonデバッガー(pdb)とはソフトウェア開発の分野では、プログラム内のエラー(バグ)を発見し修正するプロセスを「デバッグ」と呼びます。Pythonの標準ライブラリにはpdbモジュールが含まれており、これはPythonプログラムをデバッグするための一連のユーティリティを提供します。デバッグ機能はPdbクラスとして定義されており、このモジュールは内部的にbdbおよびcmdモジュールを利用しています。コマンドラインからの起動方法pdbモジュールには非常に便利なコマンドラインインターフェースが用意されています。Pythonスクリプトの実行時に-mスイッチを使ってインポートすることで、デバッガー

  2. Pythonにおける「+=」と「=+」の違いとは?演算子の動作をわかりやすく解説

    Pythonには見た目がよく似ているのに、まったく異なる動作をする演算子が存在します。その代表例が「+=」と「=+」です。この2つは一見同じように見えますが、実際には意味も役割も大きく違います。本記事では、それぞれの動作の仕組みと具体的な使い方を詳しく解説します。 「+=」は複合代入演算子(in-place演算) +=は、Pythonでは複合代入演算子と呼ばれるもので、内部的には object.__iadd__() メソッドへのシンタックスシュガー(糖衣構文)です。 公式ドキュメントには次のように記載されています。 これらのメソッドは、拡張された算術代入(+=、-=、*=、@=、/=、//=