【问题标题】:How can we plot multiple lines of a function with a for loop to minimize the coding?我们如何使用 for 循环绘制函数的多行以最小化编码?
【发布时间】:2020-01-20 20:20:42
【问题描述】:
def k(x,b):
    return x**b

x = np.linspace(0,10,100)

L = k(x,1)
plt.plot(x,L, label = 'n=1')


L2 = k(x,2)
plt.plot(x,L2, label = 'n=2')

plt.show()

我正在尝试绘制 x^b 的多项式。

我可以为不同的b 值绘制函数,但我需要通过使用 for 循环或更改b 值然后将它们绘制成一个图表的好方法来使代码更高效。

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    查看plot 文档。我相信y(第二个参数)可以是(n,m)形状,其中nx 大小相同,m 是您要绘制的线数:

    In [156]: x = np.linspace(0,10,11) 
    In [160]: y = x[:,None]**np.array([1,2,3])                                                       
    In [161]: y                                                                                      
    Out[161]: 
    array([[   0.,    0.,    0.],
           [   1.,    1.,    1.],
           [   2.,    4.,    8.],
           [   3.,    9.,   27.],
           [   4.,   16.,   64.],
           [   5.,   25.,  125.],
           [   6.,   36.,  216.],
           [   7.,   49.,  343.],
           [   8.,   64.,  512.],
           [   9.,   81.,  729.],
           [  10.,  100., 1000.]])
    In [162]: plt.plot(x, y)                                                                         
    Out[162]: 
    [<matplotlib.lines.Line2D at 0x7ff738082940>,
     <matplotlib.lines.Line2D at 0x7ff738082a90>,
     <matplotlib.lines.Line2D at 0x7ff738082be0>]
    

    查看plot 文档,了解如何为多行提供标签。

    y 计算利用了numpy broadcasting,允许我们使用 2 个一维数组,生成一个新的二维数组。

    【讨论】:

    • 这应该是公认的答案:它在性能和开发时间方面都是最有效的,+1 来自我
    • @WilliamMiller,但我没有包括这个数字。 :)
    • 或文档链接 - 我的意思是,有时真的很难找到 matplotlib.pyplot.plt 页面......我将不得不撤销我的投票,这只是草率跨度>
    【解决方案2】:

    你可以这样做:

    def k(x,b):
        return x**b
    
    x = np.linspace(0,10,100)
    for n in range(1, 3):
        L = k(x,n)
        plt.plot(x,L, label = f'n={n}')
    
    # To add the legend:
    plt.legend()
    plt.show()
    

    【讨论】:

      【解决方案3】:

      我可以为不同的 b 值绘制函数,但我需要通过使用 for 循环或更改 b 值的好方法,然后将它们绘制到一个图中来使代码更高效。

      循环不会使您的代码更有效率。根据定义:

      效率·效率·效率

      (尤其是系统或机器)以最少的努力或费用实现最大的生产力

      循环以及您的包装器都是白费力气。它使您的代码更难阅读、维护,并且计算成本更高,因为这意味着要初始化更多帧。如The Zen of Python中所述:

      简单胜于复杂。

      你绝对没有理由不简单地写:

      x = np.linspace(0,10,100)
      plt.plot(x, x**1, label='n=1')
      plt.plot(x, x**2, label='n=2')
      
      plt.show()
      

      【讨论】:

      • 代码会更高效:行数越少,可读性越好,也更容易维护。
      • 除非我遗漏了一些明显的东西,否则我无法理解添加不必要的层将如何根据提供的代码以任何方式提高效率。在我看来,用于 2 次调用的循环以及运算符包装器是多余的。
      • 这里的目标不是让代码更快,目标是代码更少。如果您想让 n 达到 100,您的解决方案将需要大量编码,从而浪费时间
      • 是的,如果。但是根据提供的代码,它是多余的。
      • 这是最小的可重现问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多