HOWTO · Python

Python の虚数

このチュートリアルでは、Python の虚数について説明します

このページの内容

Python では、実部と虚部を持つ値を組み込みの complex 型で表します。虚数単位には j(または J)を使い、8 + 5j のように記述するか、complex(real, imaginary) で値を作成します。以下の例では、Python で複素数を作成し、調べ、計算に使う方法を説明します。

Python の複素数型で虚数を表す

複素数には実部と虚部があります。Python では、技術分野の慣例に従い、虚部の接尾辞に j を使います。たとえば 8 + 5j は、8 に虚数単位の5倍を加えた値です。組み込みの complex() コンストラクターには、実部と虚部を別々の数値として渡せます。どちらの書き方でも、結果は complex 型のインスタンスになります。

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

a = 8 + 5j
b = complex(8, 5)
print(type(a))
print(a == b)
<class 'complex'>
True

入力値や別の場所で計算した値のように、実部と虚部がすでに別々にある場合は、コンストラクターを使います。第2引数は虚数単位に掛ける係数です。そのため、complex(8, 5) は 8 + 5j を表します。

複素数の実部・虚部と共役を調べる

.real と .imag は属性なので、括弧を付けずに読み取ります。これらは実部と虚部を浮動小数点数として返します。.conjugate() はメソッドです。括弧を付けて呼び出すと、実部はそのままに、虚部の符号を反転した複素共役が得られます。

たとえば 8 + 5j の実部は 8.0、虚部は 5.0、複素共役は (8-5j) です。複素共役は複素数の計算で役立ちます。分母が複素数である商を簡単にするときにも使えます。

このセクションのコードと表示されるラベルや出力は英語のままです。

value = 8 + 5j
print(value.real)
print(value.imag)
print(value.conjugate())

複素数で算術演算を行う

Python の算術演算子は複素数にそのまま使えます。加算では実部同士と虚部同士をそれぞれ足します。乗算は通常の代数規則に従い、j * j == -1 を使って計算します。a = 8 + 5j、b = 10 + 2j の場合、a + b は 18 + 7j、a * b は 70 + 66j です。

a.imag + b.imag だけを計算すると 7.0 になります。この式で足しているのは虚部だけであり、2つの複素数の和ではありません。複素数全体を加算するには a + b を使います。

このセクションのコードと表示されるラベルや出力は英語のままです。

a = 8 + 5j
b = 10 + 2j
print(a + b)
print(a * b)

複素数値の数学計算に cmath を使う

標準ライブラリの cmath モジュールには、複素数を入力として受け取り、複素数の結果を返すことがある数学関数が用意されています。角度をラジアンで求めるには cmath.phase(value)、指数関数には cmath.exp(value) を使います。また、三角関数や双曲線関数の計算には cmath.sin(value) や cmath.sinh(value) などを使えます。これらは cmath モジュールの関数であり、複素数のメソッドではありません。

このセクションのコードと表示されるラベルや出力は英語のままです。

import cmath

value = 1 + 1j
print(cmath.phase(value))
print(cmath.exp(value))
print(cmath.sin(value))
print(cmath.sinh(value))
0.7853981633974483
(1.4686939399158851+2.2873552871788423j)
(1.2984575814159773+0.6349639147847361j)
(0.6349639147847361+1.2984575814159773j)

偏角の単位はラジアンです。一般的な実数値の math 関数は、通常、実数を入力として想定しています。複素数を含む計算には cmath を使います。結果には浮動小数点数の近似値が表示されることがあるため、数値を検証するときは許容誤差を使って比較してください。

NumPy 配列に複素数を格納する

NumPy は配列を扱うための任意のサードパーティーライブラリです。numpy.array() 関数を使うと、たとえば numpy.array([8 + 5j, 10 + 2j, 4 + 3j]) のように、1次元配列へ複素数を格納できます。NumPy はこれらの値から複素数型の dtype を推論するため、配列演算でも実部と虚部の両方が保たれます。このライブラリの例を使うには、自分の環境に NumPy をインストールしてインポートしてください。Python 組み込みの complex 型を使うだけなら、NumPy は必要ありません。

このセクションのコードと表示されるラベルや出力は英語のままです。

import numpy

values = numpy.array([8 + 5j, 10 + 2j, 4 + 3j])
print(values)
[ 8.+5.j 10.+2.j  4.+3.j]

複数の複素数に数値演算をまとめて適用する場合は、NumPy 配列を選びます。単一の値や小規模な計算なら、組み込み型と演算子で十分です。配列の表示形式は NumPy が処理するため、空白の入り方や表示精度は値や出力設定によって変わることがあります。