在学习如何使用matplotlib简单地绘制tan函数图时,我偶然发现网上有这样一行代码tan_y[:-1][np.diff(tan_y) < 0]。我只是想知道 各部分 准则的内容
import matplotlib.pyplot as plt
import numpy as np
#In Degrees
x = np.linspace(0,360,600)
tan_y = np.tan(x*(np.pi/180))
tan_y[:-1][np.diff(tan_y) < 0] = np.nan #Not quite sure what the start of this function does
plt.plot(x,tan_y,linewidth = 3) #Plot tan function
plt.ylim(-20,20)
plt.xlabel('X', fontweight = 'bold', fontsize = 12)
plt.ylabel(r'$\sin(x)$', fontweight = 'bold', fontsize = 12)
plt.title('Wave', fontweight = 'bold', fontsize = 14)
plt.grid(True)
plt.show()
程序语法解释
tan_y
是一个 numpy.dnarray
它代表了数学的序数。棕褐色 函数,之前已经定义。它是一个600元素长的数组。
tan_y[:-1]
提取数组中的每个元素,直到最后一个,排除。由于在Python中,循环的停止元素是独占的,所以这是一种放弃数组最后一个元素的方法,请看这个例子。
for i in range(5):
print(i)
0
1
2
3
4
Number 5
它没有被打印出来,因为它是循环的停止元素。所以。tan_y[:-1]
是删除这个数组中最后一个元素的方法,所以 tan_y[:-1]
是599个元素长。
np.diff(tan_y)
的 "导数"。tan_y
,见 文件. 它把第i个元素减去前一个元素(i-1)-th,就像这个例子一样。
import numpy as np
x = np.array([0, 1, 2, 5, 8, 4, -1])
dx = np.diff(x)
print(dx)
[ 1 1 3 3 -4 -5]
正如你所看到的,结果是一个数组,其中每个元素都是每个元素之间的差值的结果 x
及其以前的。重要提示:结果是 dx
短于1个元素 x
因为计算方式的原因。这就是为什么你需要删除最后一个元素的原因。tan_y
在前一点。tan_y
和 np.diff(tan_y)
必须具有相同的长度才能进行比较。在这种情况下,两者都是599元素长。
np.diff(tan_y) < 0
生成一个长度相同的布尔数组。np.diff(tan_y)
,在这种情况下,599,其中。
np.diff(tan_y)
是正数,则第i个元素 np.diff(tan_y) < 0
设置为 False
np.diff(tan_y)
是负数,则第i个元素 np.diff(tan_y) < 0
设置为 True
这是一种创建过滤器的方法:一个数组的 True
和 False
根据指定的条件。
tan_y[:-1][np.diff(tan_y) < 0]
将你在第4点创建的过滤器应用到第2点生成的数组中。为了做到这一点,两个数组必须具有相同的长度,在这种情况下,599元素长。
tan_y[:-1][np.diff(tan_y) < 0] = np.nan
设置为 NaN
要素 tab_y
其中其导数为负数。
数学意义
到目前为止还不错吧?如果我对Python语言的解释还没有让你失去兴趣的话,我们就进入数学部分。我想您应该知道 tan(x)
是一个 递增单调函数. 这意味着它正在全面崛起。领域. 换句话说,它的导数在其域内必须始终是正值。如果你试着运行这段代码,没有这行代码,你会看到这样的东西。
这些垂直的线条是什么? 是函数的渐近线的对应关系?这是因为 plt.plot()
不知道它正在策划一个 tan(x)
,它有渐近线。plt.plot()
简单地在你指定的曲线的每一点之间画一条线。为了更好地理解这一点,我用少量的点(30)和这个选项重新绘制了之前的图。
plt.plot(x,tan_y,'o-',linewidth = 2)
这就是我得到的结果
很难看吧?通常情况下,如果你想 掩耳盗铃,你增加的点,这提高了 决心 的曲线。尽管如此,垂直线依然存在。所以,这条线
tan_y[:-1][np.diff(tan_y) < 0] = np.nan
是一种设置为 NaN
的值 tan_y
当它的导数为负值时:正好与垂直线对应,这样就可以把它们去掉了! 有了这个滤波器,图形就变成了。
一个干净,平滑的 tan(x)
没有渐变线的图形。