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 数组中处理虚数值的常见步骤。