在python中,这是做什么的: tan_y[:-1][np.diff(tan_y) < 0] 。

问题描述 投票:-1回答:1

在学习如何使用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()
python numpy matplotlib trigonometry
1个回答
3
投票

程序语法解释

  1. tan_y 是一个 numpy.dnarray它代表了数学的序数。棕褐色 函数,之前已经定义。它是一个600元素长的数组。

  2. 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个元素长。

  3. 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_ynp.diff(tan_y) 必须具有相同的长度才能进行比较。在这种情况下,两者都是599元素长。

  4. np.diff(tan_y) < 0 生成一个长度相同的布尔数组。np.diff(tan_y),在这种情况下,599,其中。

    • 如果第i个元素 np.diff(tan_y) 是正数,则第i个元素 np.diff(tan_y) < 0 设置为 False
    • 如果 np.diff(tan_y) 是负数,则第i个元素 np.diff(tan_y) < 0 设置为 True

    这是一种创建过滤器的方法:一个数组的 TrueFalse 根据指定的条件。

  5. tan_y[:-1][np.diff(tan_y) < 0] 将你在第4点创建的过滤器应用到第2点生成的数组中。为了做到这一点,两个数组必须具有相同的长度,在这种情况下,599元素长。

  6. tan_y[:-1][np.diff(tan_y) < 0] = np.nan 设置为 NaN 要素 tab_y 其中其导数为负数。


数学意义

到目前为止还不错吧?如果我对Python语言的解释还没有让你失去兴趣的话,我们就进入数学部分。我想您应该知道 tan(x) 是一个 递增单调函数. 这意味着它正在全面崛起。领域. 换句话说,它的导数在其域内必须始终是正值。如果你试着运行这段代码,没有这行代码,你会看到这样的东西。

enter image description here

这些垂直的线条是什么? 是函数的渐近线的对应关系?这是因为 plt.plot() 不知道它正在策划一个 tan(x),它有渐近线。plt.plot() 简单地在你指定的曲线的每一点之间画一条线。为了更好地理解这一点,我用少量的点(30)和这个选项重新绘制了之前的图。

plt.plot(x,tan_y,'o-',linewidth = 2)

这就是我得到的结果

enter image description here

很难看吧?通常情况下,如果你想 掩耳盗铃,你增加的点,这提高了 决心 的曲线。尽管如此,垂直线依然存在。所以,这条线

tan_y[:-1][np.diff(tan_y) < 0] = np.nan

是一种设置为 NaN 的值 tan_y 当它的导数为负值时:正好与垂直线对应,这样就可以把它们去掉了! 有了这个滤波器,图形就变成了。

enter image description here

一个干净,平滑的 tan(x) 没有渐变线的图形。

© www.soinside.com 2019 - 2024. All rights reserved.