HOWTO · NumPy
NumPy の配列における虚数
このチュートリアルでは、虚数を numpy 配列に格納する方法を示します。
このページの内容
Pythonでは、複素数リテラルの虚部を 2j のように j で表します。NumPy配列にはこうした複素数を格納でき、要素ごとの演算を行ったり、各値の実部と虚部を取り出したりできます。値があらかじめ決まっている場合は複素数リテラルを使い、実数の入力から作成した配列に後で複素数の結果を格納する場合は、作成時に複素数の dtype を指定します。
複素数を含むNumPy配列を作成する
虚数は実部を持たず、複素数は実部と虚部を組み合わせた数です。Pythonでは j を付けて虚部を表します。そのため、2j は純虚数で、1 + 2j は実部と虚部の両方を持ちます。複素数リテラルから配列を作ると、NumPyは複素数型を推論します。初期データに実部と虚部の両方が含まれている場合に便利です。
次の例を実行します。
import numpy as np
values = np.array([1 + 2j, 3 + 4j, 5 + 6j])
print(values)
[1.+2.j 3.+4.j 5.+6.j]
配列には3つの値が含まれています。表示された各要素では、符号の前の数が実部、j が付いた数が虚部です。NumPyの簡潔な表示は値の表現方法であり、Pythonの j 表記が変わるわけではありません。リテラルを書くときは、虚部に j を付けてください。代わりに 1 + 2 と書くと、どちらの項にも虚数を示す記号がないため、通常の実数になります。
配列の初期化時に複素数のdtypeを選ぶ
配列を実数で初期化し、後の計算結果として複素数を保持する必要がある場合は、初期化時に複素数の dtype を指定します。たとえば np.ones(3, dtype=complex) は、実数の1で初期化された複素数型の要素を3つ作成します。実数だけの入力からNumPyに型を推論させると、配列の型は実数型になります。実数型の配列に複素数を代入しても、虚部を保持できません。あらかじめ型を指定すれば、そのような情報の損失を防ぎ、配列の用途も明確になります。
これは配列の要素型を選ぶことであり、虚部を加えるための別の演算ではありません。複素数型の配列には、虚部がゼロの複素数も格納できます。一方、1.0 のような実数に見える値だけでは、配列が複素数型になるわけではありません。データ元は実数でも、後の計算や代入で複素数が必要なら dtype=complex を使います。初期値にすでに虚部が含まれている場合は、複素数リテラルを使えばNumPyが複素数型を推論します。
複素数配列で演算する
形状が適合する2つの配列に標準の算術演算子を適用すると、NumPyは要素ごとに演算します。次の完全な例では、2つの配列を作成し、和、差、積、商を計算します。各演算の結果は新しい配列になり、複素数の除算には通常の複素数の演算規則が適用されます。入力は、分母の要素がゼロにならないように選んであります。表示されるラベルの “Addition” は和、“Subtraction” は差、“Multiplication” は積、“Division” は商を示します。コードと出力のラベルは英語のままです。
import numpy as np
left = np.array([1 + 2j, 3 + 4j])
right = np.array([2 + 3j, 4 + 5j])
added = left + right
subtracted = left - right
multiplied = left * right
divided = left / right
print("Addition:", added)
print("Subtraction:", subtracted)
print("Multiplication:", multiplied)
print("Division:", divided)
Addition: [3.+5.j 7.+9.j]
Subtraction: [-1.-1.j -1.-1.j]
Multiplication: [-4. +7.j -8.+31.j]
Division: [0.61538462+0.07692308j 0.7804878 +0.02439024j]
配列の形状が同じなので、対応する要素同士が組み合わされます。たとえば left の最初の要素は right の最初の要素と演算され、2番目の要素についても同様です。これは要素ごとの演算であり、行列積ではありません。行列積には、適切な行列演算を使ってください。除算では分母の値に注意が必要です。分母がゼロの場合、有限の商は得られないため、目的の計算に適した入力を選びます。
実部と虚部を取り出す
複素数のNumPy配列では、.real と .imag を使うと、それぞれ実部と虚部の配列ビューを取得できます。後続の計算で一方の成分だけが必要な場合や、2つの成分を個別に確認したい場合に便利です。成分の配列でも元の配列と要素の位置は同じなので、それぞれの配列のインデックス k は、元の複素数配列のインデックス k に対応します。
import numpy as np
values = np.array([1 + 2j, 3 + 4j, 5 + 6j])
real_parts = values.real
imaginary_parts = values.imag
print("Real parts:", real_parts)
print("Imaginary parts:", imaginary_parts)
この例の値では、実部は 1、3、5、虚部は 2、4、6 です。これらの属性は既存の値を分けて取り出すもので、元の複素数配列は変更しません。実部と虚部の配列から複素数配列を作るには、対応する入力の形状が適合していることを確認したうえで、real_parts + 1j * imaginary_parts のように組み合わせます。複素数リテラルによる作成、明示的な複素数 dtype の指定、要素ごとの演算、成分の取得を使えば、NumPy配列で虚数を扱う際の基本的な手順を実行できます。