Pythonで3次元配列の逆テンソルを求める方法【numpy.linalg.tensorinv】
numpy.linalg.tensorinv()とは
Pythonで3次元配列(テンソル)の「逆」を計算するには、NumPyのnumpy.linalg.tensorinv()メソッドを使用します。このメソッドは、tensordot演算tensordot(a, b, ind)に対する逆テンソルを返します。つまり、浮動小数点精度の範囲内で、tensordot(tensorinv(a), a, ind)がtensordot演算における「単位」テンソルになるという性質を持ちます。
戻り値はaのtensordot逆テンソルであり、その形状はa.shape[ind:] + a.shape[:ind]となります。
主なパラメータ
- a:「逆」を求める対象となるテンソル。形状は「正方形」である必要があります。すなわち、
prod(a.shape[:ind]) == prod(a.shape[ind:])を満たさなければなりません。 - ind:逆和に関与する先頭インデックスの数。正の整数を指定する必要があり、デフォルト値は2です。
3次元配列の逆を求める手順
まず、必要なライブラリをインポートします。
import numpy as np
from numpy.linalg import inv
numpy.eye()を使って配列を作成します。この関数は、対角成分が1、それ以外が0の2次元配列を返します。
arr = np.eye(4*6)
作成した配列の形状を変更します。
arr.shape = (24, 8, 3)
配列を表示して内容を確認します。
print("Our Array...\n", arr)
配列の次元数を確認します。
print("\nDimensions of our Array...\n", arr.ndim)
配列のデータ型を確認します。
print("\nDatatype of our Array object...\n", arr.dtype)
配列の形状を確認します。
print("\nShape of our Array object...\n", arr.shape)
3次元配列の逆を計算するには、numpy.linalg.tensorinv()メソッドを使用します。
print("\nResult...\n", np.linalg.tensorinv(arr, ind = 1))
完全なコード例
import numpy as np
from numpy.linalg import inv
# 配列を作成
# numpy.eye()は対角成分が1、それ以外が0の2次元配列を返します
arr = np.eye(4*6)
# 作成した配列の形状を変更
arr.shape = (24, 8, 3)
# 配列を表示
print("Our Array...\n", arr)
# 次元数を確認
print("\nDimensions of our Array...\n", arr.ndim)
# データ型を確認
print("\nDatatype of our Array object...\n", arr.dtype)
# 形状を確認
print("\nShape of our Array object...\n", arr.shape)
# 3次元配列の逆を計算するには、numpy.linalg.tensorinv()メソッドを使用します
print("\nResult...\n", np.linalg.tensorinv(arr, ind = 1))
実行結果
プログラムを実行すると、以下のような出力が得られます(出力が非常に長いため、一部省略して掲載しています)。
Our Array... [[[1. 0. 0.] [0. 0. 0.] [0. 0. 0.] ... [0. 0. 0.]]] ...(中略:対角成分に沿って1が並ぶ構造)... [[[0. 0. 0.] [0. 0. 0.] ... [0. 0. 1.]]] Dimensions of our Array... 3 Datatype of our Array object... float64 Shape of our Array object... (24, 8, 3) Result... [[[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. 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.]] ...(中略)... [[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. 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. 0. 0. 0. 1.]]]
結果のポイント
この例では、np.eye(4*6)で生成した24×24の単位行列を、形状(24, 8, 3)の3次元配列へと変形しています。tensorinv(arr, ind=1)の結果として得られる配列の形状は(8, 3, 24)です。この逆テンソルと元の配列をtensordotで縮約すると、浮動小数点誤差の範囲で恒等変換(単位テンソル)になることが確認できます。
なお、tensorinv()は通常の逆行列を求めるnumpy.linalg.inv()とは異なり、テンソル縮約演算に対する逆を計算する点に注意してください。2次元配列に対してind=1を指定した場合には、通常の逆行列と同じ結果となります。
-
Python Pandas - Interval(区間)の長さを取得する方法
pandasのIntervalオブジェクトの長さを取得するには、interval.lengthプロパティを使用します。まず、必要なライブラリをインポートしましょう。 import pandas as pd 次に、closedパラメータに「neither」を指定して開区間を作成します。開区間とは、数学で丸括弧で表される区間のことで、両端の値を含まない区間を指します。例えば、開区間 (0, 5) は「0 < x < 5」という条件で特徴付けられます。 interval = pd.Interval(5, 20, closed=neither) 作成した区間の長さを表示してみましょう。 p
-
Pythonで配列が「美しい」かどうかを判定する方法
この記事では、ユニークな要素からなる配列 nums が与えられたときに、その配列が「美しい配列」と呼べる条件を満たしているかどうかを判定する方法を解説します。満たすべき条件は以下の2つです。すべての要素が 1 から n の範囲内に収まっていること配列が昇順にソートされていないことたとえば、入力が nums = [2,6,1,5,3,4] の場合、出力は True になります。これは、すべての要素が 1〜6 の範囲に存在し、かつ昇順に並んでいないためです。解法のアプローチこの問題は、次の手順で解くことができます。n := nums のサイズとするtotal := nums[0] で初期化するis