Python NumPyのeinsum()でアインシュタインの縮約記法による配列軸の総和を計算する方法
NumPyのeinsum()メソッドは、オペランドに対してアインシュタインの縮約記法(Einstein summation convention)を評価するための強力なツールです。この記法を活用すると、多次元配列や線形代数における多くの一般的な演算を、非常にシンプルな形式で表現できます。
einsumには2つの動作モードがあります。暗黙モードでは、標準的なアインシュタインの縮約に従って値が計算されます。一方、明示モードでは、特定の添字ラベルへの総和を無効化または強制できるため、古典的なアインシュタインの縮約演算とは見なされないような、より柔軟な配列操作も実現可能です。
numpy.einsum()メソッドの基本
アインシュタインの縮約記法を使って配列の特定の軸に沿って総和(axis sum)を求めるには、Pythonのnumpy.einsum()メソッドを使用します。主なパラメータは以下の通りです。
- 第1パラメータ(subscripts): 総和の対象を指定する添字ラベルを、カンマ区切りのリスト形式で記述します。
- 第2パラメータ(operands): 演算の対象となる配列を渡します。
例えば、'ij->i'という添字を指定すると、2次元配列の各行(j方向)に沿って合計が計算され、行ごとの総和を持つ1次元配列が返されます。
実装手順
ステップ1:必要なライブラリをインポートする
まず、必要なライブラリをインポートします。
import numpy as np
ステップ2:NumPy配列を作成する
arange()メソッドとreshape()メソッドを組み合わせて、NumPy配列を作成します。
arr = np.arange(16).reshape(4,4)
ステップ3:配列を表示する
作成した配列を表示して確認します。
print("Our Array...\n",arr)ステップ4:次元数を確認する
配列の次元数を確認します。
print("\nDimensions of our Array...\n",arr.ndim)ステップ5:データ型を確認する
配列オブジェクトのデータ型を取得します。
print("\nDatatype of our Array object...\n",arr.dtype)ステップ6:形状を確認する
配列オブジェクトの形状を取得します。
print("\nShape of our Array object...\n",arr.shape)ステップ7:einsum()で軸の総和を計算する
アインシュタインの縮約記法を用いて、配列の軸に沿った総和をnumpy.einsum()メソッドで計算します。
print("\nResult...\n",np.einsum('ij->i', arr))完全なコード例
ここまでの手順をまとめた完全なサンプルコードは以下の通りです。
import numpy as np
# arange()とreshape()メソッドでNumPy配列を作成
arr = np.arange(16).reshape(4,4)
# 配列を表示
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)
# アインシュタインの縮約記法で軸に沿った総和を計算
print("\nResult...\n",np.einsum('ij->i', arr))実行結果
Our Array... [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] Dimensions of our Array... 2 Datatype of our Array object... int64 Shape of our Array object... (4, 4) Result... [ 6 22 38 54]
結果の解説
出力を見ると、4×4の2次元配列に対して'ij->i'という添字を指定することで、各行の要素が合計された結果 [ 6 22 38 54] が得られています。これは以下の計算に相当します。
- 0 + 1 + 2 + 3 = 6
- 4 + 5 + 6 + 7 = 22
- 8 + 9 + 10 + 11 = 38
- 12 + 13 + 14 + 15 = 54
つまり、np.einsum('ij->i', arr)はnp.sum(arr, axis=1)と同等の動作をします。einsum()を使いこなすことで、内積・外積・転置・対角成分の抽出など、さまざまな配列操作を統一的かつ効率的に記述できるようになります。
-
Python NumPyのpolyder()で特定の軸に沿って多項式を微分する方法
PythonのNumPyでは、polynomial.polyder()メソッドを使うことで多項式を微分できます。このメソッドは、指定した軸(axis)に沿って多項式の係数cをm回微分した結果を返します。各反復処理のたびに、結果はscl(スケーリング係数)と掛け合わされます。このスケーリング係数は、変数の線形変換を行う際に使用されます。polyder()メソッドの引数について係数配列cは、各軸に沿って次数の低いものから高いものへと並べられます。例えば、[1,2,3]は「1 + 2*x + 3*x**2」という多項式を表し、[[1,2],[1,2]]はaxis=0がx、axis=1がyである場合、
-
Pythonのnumpy.deg2rad()を使って角度を度からラジアンに変換する方法
PythonのNumPyでは、numpy.deg2rad()メソッドを使用することで、度(デグリー)単位の配列をラジアンに変換できます。このメソッドは入力された角度に対応するラジアン値を返し、入力がスカラーであればスカラーを返します。第1引数には、度単位の入力角度を指定します。第2引数と第3引数は省略可能です。deg2rad()の主なパラメータ第2引数(out)はndarray型で、計算結果を格納する場所を指定します。指定する場合は、入力がブロードキャストされる形状と一致している必要があります。省略した場合やNoneを指定した場合は、新しく確保された配列が返されます。第3引数(where)は条