HOWTO · NumPy

NumPy 陣列中的虛數

本教程演示瞭如何將虛數儲存在 numpy 陣列中。

本頁內容

Python 會用 j 表示複數文字中的虛部,例如 2j。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]

此陣列包含三個值。每個顯示出的元素中,符號前的數字是實部,連接 j 的數字是虛部。NumPy 的精簡顯示方式只是呈現這些值,並不會改變 Python 使用 j 的記法。撰寫複數文字時,請在虛部項目保留 j 後綴。若改寫成 1 + 2,就會得到一般實數,因為兩個項目都沒有標示為虛數。

初始化陣列時選擇複數 dtype

如果陣列一開始存放實數,但之後必須保留複數結果,請在初始化時選擇複數 dtype。例如,np.ones(3, dtype=complex) 會建立三個以實數 1 初始化的複數元素。若讓 NumPy 根據純實數輸入推斷型別,產生的陣列就會是實數 dtype;將複數指定給實數陣列時,虛部無法保留下來。事先設定型別可避免這種資料損失,也能清楚表明陣列的預期用途。

這項設定決定的是陣列元素的型別,並不是額外執行一個「加入虛部」的操作。複數值即使虛部為零,仍可存放在複數型別的陣列中。反過來說,看起來像實數的值,例如 1.0,本身並不會讓陣列變成複數型別。若資料來源是實數,但後續計算或指定值需要複數,請使用 dtype=complex。若初始值已包含虛部,則可直接使用複數文字;NumPy 能從這些值推斷複數型別。

對複數陣列進行算術運算

兩個陣列的形狀相容時,NumPy 會逐元素套用標準算術運算子。以下完整範例會建立兩個陣列,並計算它們的總和、差、乘積與商。每個結果都是新的陣列,而複數除法遵循複數的一般運算規則。範例刻意選用分母元素皆不為零的輸入。

輸出中的標籤會維持英文: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 的第一個元素運算,第二個元素也以相同方式配對。這是逐元素算術運算,不是矩陣乘法。若要計算矩陣乘積,請改用適當的矩陣運算。除法時也要留意分母:分母為零時,商不會是有限值,因此請依照預定的計算選擇合適的輸入。

取得實部與虛部

對複數 NumPy 陣列而言,.real 和 .imag 分別提供實部與虛部的陣列檢視。當後續計算只需要其中一個部分,或想分別檢視兩個部分時,這些屬性就很有用。這些分量陣列會保留原本的元素位置,因此其中的索引 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 陣列中處理虛數的常見步驟。