Python中处理复数并不需要额外安装库,内建的complex类型就能完成基本的复数定义与四则运算。本文基于Python交互环境演示实际用法,覆盖complex函数、带j字面量、算术运算、cmath模块、math模块差异以及numpy复数数组操作。
一、创建复数与基本属性
复数可以用complex(real, imag)函数创建,也可以直接使用带后缀j的浮点数字面量。虚数部分不能单独存在,必须与实部一起组成复数,而且虚部必须以j或J结尾。
- >>> a = complex(2, 4)
- >>> b = 3 - 5j
- >>> a
- (2+4j)
- >>> b
- (3-5j)
- >>> a.real
- 2.0
- >>> a.imag
- 4.0
- >>> a.conjugate()
- (2-4j)
复制代码
a.real返回实部,a.imag返回虚部,a.conjugate()返回共轭复数。可以看出,实部和虚部在Python内部都是以浮点数保存的。
二、四则运算与模长计算
Python的复数支持加法、减法、乘法、除法以及abs()求模长,运算结果会保持复数类型,除法结果也会自动计算为最简复数形式:
- >>> a + b
- (5-1j)
- >>> a * b
- (26+2j)
- >>> a / b
- (-0.4117647058823529+0.6470588235294118j)
- >>> abs(a)
- 4.47213595499958
复制代码
abs()返回的是复数的模,即sqrt(real^2 + imag^2)。
三、使用cmath模块处理复数函数
如果要对复数执行正弦、余弦、指数或平方根等数学运算,需要导入cmath模块,而不是math模块。cmath中的函数接受并返回复数:
- >>> import cmath
- >>> cmath.sin(a)
- (24.83130584894638-11.356612711218174j)
- >>> cmath.cos(a)
- (-11.36423470640106-24.814651485634187j)
- >>> cmath.exp(a)
- (-4.829809383269385-5.5920560936409816j)
- >>> cmath.sqrt(-1)
- 1j
复制代码
cmath.sqrt(-1)会返回复数1j,这是solve实数负数开平方问题的关键方式。
四、math模块与cmath模块的差异
Python的标准数学函数math模块默认不产生复数值,当遇到负数开平方这类需要复数结果的操作时会直接抛出异常:
- >>> import math
- >>> math.sqrt(-1)
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- ValueError: math domain error
复制代码
因此在数学计算中如果需要复数结果,必须显式使用cmath模块,或者使用支持复数的第三方库来声明复数类型的运算。
五、numpy中的复数数组支持
Python中大部分与数学相关的模块都能处理复数。使用numpy时,可以直接构造复数数组并对每个元素执行向量化操作:
- >>> import numpy as np
- >>> a = np.array([2+3j, 4+5j, 6-7j, 8+9j])
- >>> a
- array([ 2.+3.j, 4.+5.j, 6.-7.j, 8.+9.j])
- >>> a + 2
- array([ 4.+3.j, 6.+5.j, 8.-7.j, 10.+9.j])
- >>> np.sin(a)
- array([ 9.15449915 -4.16890696j, -56.16227422 -48.50245524j,
- -153.20827755-526.47684926j, 4008.42651446-589.49948373j])
复制代码
numpy的数组广播机制对复数同样有效,a + 2会把整数2自动转为实数部分并加到每个元素的实部上。
六、复数语法要点与对象属性
复数的表示形式可以用下面的规则概括:
1. 复数由实部和虚部构成,形式为real + imagj,虚部后缀必须是j或J。
2. 虚数不能单独存在,它总是和实部一起构成复数,即使实部为0.0也会显示。
3. 实部和虚部都以浮点数形式存储。
4. 复数对象包含real、imag属性用于获取实部和虚部,conjugate()方法用于返回共轭复数。
实际开发中,如果涉及信号处理、图像计算或科学计算,Python的复数对象配合cmath和numpy能很大程度简化代码,避免自己实现复数运算逻辑。 |