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

Pythonでアインシュタインの縮約記法を使って行列とベクトルの積を計算する方法

Pythonでアインシュタインの縮約記法(Einstein summation convention)を用いて行列とベクトルの掛け算を行うには、NumPyが提供する numpy.einsum() メソッドを使用します。

einsum() メソッドは、第1引数に「添字(subscript)」を指定します。これは、縮約(総和)の対象となる添字ラベルをカンマ区切りの文字列として記述したものです。第2引数には「オペランド(operands)」、つまり演算対象となる配列を渡します。

einsum() メソッドは、オペランドに対してアインシュタインの縮約記法に基づく評価を行います。この記法を活用すると、多次元配列や線形代数における多くの一般的な演算を、非常にシンプルな形式で表現できます。暗黙モード(implicit mode)では、einsum が自動的にこれらの値を計算します。

さらに明示モード(explicit mode)では、特定の添字ラベルについての総和を無効化したり強制したりすることで、古典的なアインシュタイン縮約演算とはみなされないような配列操作も柔軟に実行できます。

手順

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

import numpy as np

array() メソッドを使って2つのNumPy配列を作成します。ここでは5×5の二次元配列(行列)と、要素数5の一次元配列(ベクトル)を用意します。

arr1 = np.arange(25).reshape(5,5)
arr2 = np.arange(5)

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

print("Array1...\n",arr1)
print("\nArray2...\n",arr2)

両方の配列の次元数(ndim)を確認します。

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)

アインシュタインの縮約記法で行列とベクトルの積を求めるには、次のように np.einsum('ij,j', arr1, arr2) を呼び出します。ここで 'ij,j' は、行列arr1の各行ベクトルとarr2の対応する要素同士を掛け合わせ、その和を取ることを意味します。

print("\nResult (Matrix Vector multiplication)...\n",np.einsum('ij,j', arr1, arr2))

サンプルコード全体

import numpy as np

# array()メソッドで2つのNumPy配列を作成
arr1 = np.arange(25).reshape(5,5)
arr2 = np.arange(5)

# 配列を表示
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)

# アインシュタインの縮約記法で行列とベクトルの積を計算
print("\nResult (Matrix Vector multiplication)...\n",np.einsum('ij,j', arr1, arr2))

実行結果

Array1...
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]

Array2...
[0 1 2 3 4]

Dimensions of Array1...
2

Dimensions of Array2...
1

Shape of Array1...
(5, 5)

Shape of Array2...
(5,)

Result (Matrix Vector multiplication)...
[ 30 80 130 180 230]

  1. Pythonで行列を操作する方法|NumPyを使った基本演算まとめ

    Pythonでは、NumPyモジュールを利用することで、行列に対するさまざまな操作や演算を簡単に実行できます。NumPyは数値計算用の強力なライブラリであり、行列演算のための便利なメソッドが多数用意されています。 主な行列演算メソッド一覧 add() — 2つの行列の対応する要素同士を加算します。 subtract() — 2つの行列の対応する要素同士を減算します。 divide() — 2つの行列の対応する要素同士を除算します。 multiply() — 2つの行列の対応する要素同士を乗算します(要素ごとの積)。 dot() — 行列の掛け算(内積)を実行します。要素ごとの乗算ではなく、数学

  2. 2つの行列を乗算するPythonプログラム

    ユーザーが入力した2つの行列を受け取り、その積(乗算結果)を表示するのがこのプログラムの目的です。ここでは、ネストされたリスト(2次元リスト)を使って行列を表現します。 行列の乗算では、「1つ目の行列の行の要素」と「2つ目の行列の列の要素」をそれぞれ掛け合わせ、その合計値を結果行列の要素とします。つまり、結果行列の i 行 j 列の値は、行列Aの i 行目と行列Bの j 列目の対応する要素同士の積の総和になります。 アルゴリズム ステップ1:2つの行列を入力する。 ステップ2:ネストされたforループで、各行・各列を順番に走査する。 ステップ3:すべての要素が0で初期化された結果用行列を用