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

Python(NumPy)で4次元配列と3次元配列のクロネッカー積を計算する方法

クロネッカー積(Kronecker Product)とは

PythonのNumPyでは、numpy.kron()メソッドを使うことで、4次元配列と3次元配列のように次元数が異なる配列同士でもクロネッカー積を簡単に求めることができます。クロネッカー積とは、第1の配列の各要素によって第2の配列全体をスケーリングしたブロックから構成される複合配列のことです。

kron()関数は、引数aとbの次元数が同じであることを前提としており、次元数が異なる場合は、小さい方の配列の先頭にサイズ1の軸が自動的に追加されます。a.shape = (r0, r1, …, rN)、b.shape = (s0, s1, …, sN) のとき、クロネッカー積の形状は (r0*s0, r1*s1, …, rN*sN) となり、各要素は次式のように定義されます。

kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN]

実行手順

1. ライブラリのインポート

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

import numpy as np

2. 配列の作成

arange()reshape()メソッドを使って、異なる次元数を持つ2つのNumPy配列を作成します。ここでは、形状(2, 5, 2, 2)の4次元配列と、形状(2, 3, 3)の3次元配列を用意します。

arr1 = np.arange(40).reshape((2,5,2,2))
arr2 = np.arange(18).reshape((2,3,3))

3. 配列の表示

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

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

4. 次元数の確認

ndim属性で、両配列の次元数を確認します。

print("\nDimensions of Array1...\n",arr1.ndim)
print("\nDimensions of Array2...\n",arr2.ndim)

5. 形状の確認

shape属性で、両配列の形状を確認します。

print("\nShape of Array1...\n",arr1.shape)
print("\nShape of Array2...\n",arr2.shape)

6. クロネッカー積の計算

2つの配列のクロネッカー積を求めるには、Python Numpyのnumpy.kron()メソッドを使用します。

print("\nResult (Kronecker product)...\n",np.kron(arr1, arr2))

完全なサンプルコード

import numpy as np

# arange()とreshape()メソッドを使って、異なる次元数の2つのNumPy配列を作成
arr1 = np.arange(40).reshape((2,5,2,2))
arr2 = np.arange(18).reshape((2,3,3))

# 配列の表示
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.kron()メソッドで2つの配列のクロネッカー積を計算
print("\nResult (Kronecker product)...\n",np.kron(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 25]
   [26 27]]

  [[28 29]
   [30 31]]

  [[32 33]
   [34 35]]

  [[36 37]
   [38 39]]]]

Array2...
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]]

Dimensions of Array1...
4

Dimensions of Array2...
3

Shape of Array1...
(2, 5, 2, 2)

Shape of Array2...
(2, 3, 3)

Result (Kronecker product)...
[[[[  0   0   0   0   1   2]
   [  0   0   0   3   4   5]
   [  0   0   0   6   7   8]
   [  0   2   4   0   3   6]
   [  6   8  10   9  12  15]
   [ 12  14  16  18  21  24]]

  [[  0   0   0   9  10  11]
   [  0   0   0  12  13  14]
   [  0   0   0  15  16  17]
   [ 18  20  22  27  30  33]
   [ 24  26  28  36  39  42]
   [ 30  32  34  45  48  51]]

  [[  0   4   8   0   5  10]
   [ 12  16  20  15  20  25]
   [ 24  28  32  30  35  40]
   [  0   6  12   0   7  14]
   [ 18  24  30  21  28  35]
   [ 36  42  48  42  49  56]]

  ...

  (以降も同様にブロックが続きます)

ご覧のとおり、3次元配列arr2の先頭には自動的にサイズ1の軸が追加され、最終的な結果は形状(2, 10, 6, 6)の4次元配列として出力されます。これは「第1の配列の各要素 × 第2の配列全体」というブロック構造がそのまま反映されたものです。

ポイントまとめ

  • クロネッカー積はnp.kron(a, b)ひとつで計算できる
  • 次元数が異なる場合、小さい方の配列の先頭にサイズ1の軸が自動的に追加される
  • 結果の形状は、各軸のサイズの積(r0*s0, r1*s1, …)になる
  • 信号処理・画像処理・テンソル演算など、さまざまな分野で活用される演算
  1. 【Python】NumPyで次元の異なる2つのベクトルの外積を計算する方法

    2つのベクトルの外積(クロス積)を計算するには、PythonのNumPyが提供する numpy.cross() メソッドを使用します。このメソッドは、計算結果である外積ベクトルcを返します。本記事では、次元の異なる2つのベクトルの外積を求める方法を、具体的なコード例とともに解説します。 numpy.cross()メソッドのパラメータ numpy.cross() メソッドの主な引数は以下の通りです。 a(第1引数):最初のベクトルの成分を指定します。 b(第2引数):2番目のベクトルの成分を指定します。 axisa(第3引数):ベクトルを定義するaの軸を指定します。デフォルトは最後の軸で

  2. 【Python】numpy.inner()で2つの多次元配列の内積を計算する方法

    2つの多次元配列の内積(インナー積)を求めるには、Pythonのnumpy.inner()メソッドを使用します。このメソッドは、1次元配列に対しては通常のベクトルの内積を計算し、高次元配列に対しては最後の軸に沿った要素ごとの積の総和を返します。 引数として渡すのは a と b の2つの配列です。なお、aとbがスカラーでない場合は、両者の最後の軸のサイズが一致している必要があります。 内積を計算する手順 まず、必要なライブラリをインポートします。 import numpy as np array()メソッドを使って、2つのNumPyの2次元配列を作成します。 arr1 = np.array([[