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

【Python・NumPy】np.convolve()で2つの1次元配列の離散線形畳み込みを計算する方法(validモードで重なり部分のみ取得)

PythonのNumPyで2つの1次元シーケンス(配列)の離散線形畳み込みを返すには、numpy.convolve()メソッドを使用します。畳み込み演算子は信号処理の分野でよく見られ、線形時不変システムが信号に与える影響をモデル化するために使われます。また、確率論においては、2つの独立な確率変数の和は、それぞれの分布の畳み込みに従って分布することが知られています。

なお、vaより長い場合、計算前に配列が自動的に入れ替えられます。このメソッドは、avの離散線形畳み込みを返します。

numpy.convolve()のパラメータ

  • 第1引数 a: 最初の1次元入力配列
  • 第2引数 v: 2番目の1次元入力配列
  • 第3引数 mode(任意): 'full'、'valid'、'same' のいずれかを指定

本記事では、このうち 'valid' モードに焦点を当てます。'valid' モードは、長さ max(M, N) - min(M, N) + 1 の出力を返します。つまり、信号同士が完全に重なっている点のみについて畳み込み積が計算され、信号境界の外側の値は一切影響しません。これにより、「2つの配列が重複する場所」だけの結果を取得できます。

実装手順

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

import numpy as np

array() メソッドを使って、2つのNumPyの1次元配列を作成します。

arr1 = np.array([1, 2, 3])
arr2 = np.array([0, 1, 0.5])

作成した配列を表示します。

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

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

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)

最後に、numpy.convolve() メソッドを使って、2つの1次元シーケンスの離散線形畳み込みを求めます。ここでは mode='valid' を指定しています。

print("\nResult....\n", np.convolve(arr1, arr2, mode='valid'))

サンプルコード全体

import numpy as np

# array()メソッドで2つのNumPyの1次元配列を作成
arr1 = np.array([1, 2, 3])
arr2 = np.array([0, 1, 0.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)

# numpy.convolve()で離散線形畳み込みを計算(validモード)
print("\nResult....\n", np.convolve(arr1, arr2, mode='valid'))

実行結果

Array1...
[1 2 3]

Array2...
[0. 1. 0.5]

Dimensions of Array1...
1

Dimensions of Array2...
1

Shape of Array1...
(3,)

Shape of Array2...
(3,)

Result....
[2.5]

出力を見ると、両配列とも次元数は1、形状は (3,) であり、'valid' モードでは出力長が max(3, 3) - min(3, 3) + 1 = 1 となるため、結果は [2.5] という1要素の配列になっています。これは、2つの信号が完全に重なる唯一の位置における畳み込み値です。

  1. Python NumPyで2つのベクトルの外積を計算する方法

    2つのベクトルの外積(クロス積)を計算するには、PythonのNumPyライブラリが提供する numpy.cross() メソッドを使用します。このメソッドは、指定された2つのベクトルの外積 c を返します。numpy.cross() メソッドの主な引数a:第1引数。最初のベクトルの成分です。b:第2引数。2番目のベクトルの成分です。axisa:第3引数。ベクトルを定義する a の軸を指定します。デフォルトは最後の軸です。axisb:第4引数。ベクトルを定義する b の軸を指定します。デフォルトは最後の軸です。axisc:第5引数。外積ベクトルを格納する c の軸を指定します。入力ベクトルがど

  2. 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, …