Pythonのeinsum()でベクトルの内積を計算する方法|アインシュタインの縮約記法の使い方
Pythonでアインシュタインの縮約記法(Einstein summation convention)を使ってベクトルの内積を計算するには、NumPyの numpy.einsum() メソッドを使用します。第1引数は「添字(subscript)」で、計算に使用する添字ラベルをカンマ区切りの文字列として指定します。第2引数は「オペランド(operands)」で、演算の対象となる配列を渡します。
einsum() メソッドは、指定されたオペランドに対してアインシュタインの縮約記法に基づく評価を行います。この記法を活用すると、多次元配列を扱う線形代数の一般的な演算の多くを、非常にシンプルな形式で表現できます。暗黙モードでは、einsum がこれらの計算を自動的に処理してくれます。
さらに、明示モードを使用すると、特定の添字ラベルについての総和を無効化したり強制したりできるため、古典的なアインシュタインの縮約記法には分類されないような配列操作も柔軟に実行できます。
手順
まず、必要なライブラリをインポートします。
import numpy as np
次に、arange() メソッドを使ってNumPy配列を作成します。
arr = np.arange(4)
作成した配列を表示します。
print("Our Array...\n",arr)
配列の次元数を確認します。
print("\nDimensions of our Array...\n",arr.ndim)
データ型を取得します。
print("\nDatatype of our Array object...\n",arr.dtype)
配列の形状(shape)を確認します。
print("\nShape of our Array object...\n",arr.shape)
ここまで準備ができたら、numpy.einsum() メソッドを使って、アインシュタインの縮約記法によるベクトルの内積を計算します。添字として 'i,i' を指定し、同じ配列を2つのオペランドとして渡すことで、各要素同士の積の総和(=内積)が求まります。
print("\nResult (inner product)...\n",np.einsum('i,i', arr, arr))
サンプルコード
import numpy as np
# arange() メソッドでNumPy配列を作成
arr = np.arange(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)
# numpy.einsum() でアインシュタインの縮約記法により内積を計算
print("\nResult (inner product)...\n",np.einsum('i,i', arr, arr))
実行結果
Our Array... [0 1 2 3] Dimensions of our Array... 1 Datatype of our Array object... int64 Shape of our Array object... (4,) Result (inner product)... 14
このように、0〜3の4要素を持つ配列の場合、内積は 0×0 + 1×1 + 2×2 + 3×3 = 14 として正しく計算されていることがわかります。einsum() を使えば、行列の積や転置など、より複雑なテンソル演算も同じ記法で簡潔に記述できるため、NumPyでの数値計算において非常に強力なツールとなります。
-
Pythonで配列とスカラーの内積を計算する方法|numpy.inner()の使い方
Pythonで配列とスカラーの内積を求めるには、NumPyのnumpy.inner()メソッドを使用します。この関数は、1次元配列に対しては通常のベクトル内積を計算し、多次元配列の場合は最後の軸に沿った要素ごとの積の総和を返します。引数には2つの配列(またはベクトル)aとbを指定します。なお、aとbがスカラーでない場合は、両者の最後の次元が一致している必要があります。実行手順まず、必要なライブラリをインポートします。import numpy as npnumpy.eye()メソッドを使って配列を作成します。このメソッドは、対角成分が1、それ以外が0の2次元配列(単位行列)を返します。arr =
-
Pythonで配列内に積がkとなる部分配列が存在するかどうかを判定する方法
問題の概要正の数と負の数が混在する配列 nums と、もうひとつの値 k が与えられます。このとき、要素の積がちょうど k になる部分配列(連続する要素からなる配列)が nums の中に存在するかどうかを判定します。たとえば、nums = [-2, -1, 1, 3, 5, 8]、k = 6 という入力の場合、部分配列 [-2, -1, 3] の積は (-2) × (-1) × 3 = 6 となるため、出力は True になります。アルゴリズムの考え方この問題は、「最大積部分配列」を求める際によく使われるテクニックと同じ発想で解くことができます。ポイントは、負の数を掛けると積の符号が反転し、そ