总是感觉搞懂了画图,然而每次遇到复数值的时候都感觉思路不是很清晰,比如,我们想要做函数​​numpy.exp(1j * x)​​​的图像,我们可以看到此时当我们带入​​x​​值进入后会得到复数值。如果我们直接用该复数值作图就会遇到警告信息提示,代码如下:

import numpy as np
import matplotlib.pyplot as plt

vertex = np.pi
x = np.linspace(-vertex, vertex, 100)
f = np.exp(1j * x)

plt.figure()
plt.plot(x, f)
plt.show()
"""
ComplexWarning: Casting complex values to real discards the imaginary part
return array(a, dtype, copy=False, order=order)
"""

我们可以看到提示信息说我们因为使用的是复数,所以自动丢弃了虚数部分,仅仅保留了实数部分,上述代码我们此时可以通过添加​​np.real()​​函数来消除这个警告信息。从这里我们也可以得出,matplotlib模块的画图命令要求输入参数应该为实数

import numpy as np
import matplotlib.pyplot as plt

vertex = np.pi
x = np.linspace(-vertex, vertex, 100)
f = np.exp(1j * x)

plt.figure()
plt.plot(x, np.real(f))
plt.show()

此时我们消除了警告提示信息,并且成功输出了如下图像。

python画图遇到复数值数据时应该用numpy.abs()函数还是numpy.real()函数_欧拉公式


不难看出这实际上是一个余弦函数,因为我们知道欧拉公式:

python画图遇到复数值数据时应该用numpy.abs()函数还是numpy.real()函数_python_02

这里​​cos(x)​​​是实部,​​sin(x)​​​是虚部,因此当我们使用​​np.real(f)​​​时,实际上我们去掉了​​sin(x)​​​的部分,此时的​​e^{ix}​​​函数实际变为了​​cos(x)​​​ 。最终不难看出,我们实际得到的图像也是​​cos(x)​​ 的图像。

那么怎样才能得到​​e^{ix}​​​函数的图像呢,答案是使用​​np.abs(f)​​.代码如下:

import numpy as np
import matplotlib.pyplot as plt

vertex = np.pi
x = np.linspace(-vertex, vertex, 100)
f = np.exp(1j * x)

plt.figure()
plt.plot(x, np.abs(f))
plt.show()

python画图遇到复数值数据时应该用numpy.abs()函数还是numpy.real()函数_码字_03


可以看到我们最后获得的结果为一条恒为​​1​​​的直线,这很好理解,​​e^{ix}​​​图像实际上为一个单位圆,所以它本身的长度,即值恒等于​​1​​。由此我们可以得到结论,画图时,如果图像输入参数值为复数,我们想要得到原本函数图像,应该使用np.abs()函数对图像输入参数值进行处理而不是使用​np.real()​函数。

如果对复数还存在问题,可以继续查看这篇python复数基础

码字不易,如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~