Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 他们说';有状态的';?_Python_Matplotlib - Fatal编程技术网

Python 他们说';有状态的';?

Python 他们说';有状态的';?,python,matplotlib,Python,Matplotlib,我对matplotlib-pyplot教程有一个问题,链接是 我以荷兰语为母语,能读标准英语。 我的问题不是关于一个不起作用的例子,而是关于文本。 在pyplot_教程的一章中,使用多个图形和轴时,他们使用了statefulness和stateful这两个词。我不明白他们的意思。我们没有荷兰语来形容它。我在网上搜索了一下,但什么也没找到。我认为有状态意味着完全,利用一切可能 我希望有人能给我一个答案。 我知道这不是一个要问的问题,因为它与编程无关,但我不知道还能问到哪里。在这种情况下,状态类似于

我对matplotlib-pyplot教程有一个问题,链接是 我以荷兰语为母语,能读标准英语。 我的问题不是关于一个不起作用的例子,而是关于文本。 在pyplot_教程的一章中,使用多个图形和轴时,他们使用了statefulness和stateful这两个词。我不明白他们的意思。我们没有荷兰语来形容它。我在网上搜索了一下,但什么也没找到。我认为有状态意味着完全,利用一切可能

我希望有人能给我一个答案。
我知道这不是一个要问的问题,因为它与编程无关,但我不知道还能问到哪里。

在这种情况下,状态类似于内存

你可以用一个类比来思考:

  • 一个无国籍的人对他们从一项任务到下一项任务的生活没有记忆

  • 一个有状态的人有记忆/从一项任务到下一项任务跟踪他们的生活

在您的情况下,无状态意味着打印值时不参考过去的值

通过有状态,库可以跟踪或记住绘制的过去的值


这避免了过多的内存消耗和处理开销。

在这种情况下,最好通过一个简单的绘图示例来理解这种差异

首先是有状态的例子:

import matplotlib.pyplot as plt

plt.figure()
plt.plot([0,1], [1,0])
然后是无状态(或者更确切地说是面向对象的方法):

它们执行相同的步骤:

  • 创建地物对象(
    matplotlib.figure.figure
  • 创建新的绘图区域对象(
    matplotlib.axes.AxesSubplot
    )并将其添加到图形中
  • 在打印区域中创建一条新线(
    matplotlib.lines.Line2D
  • 在面向对象的形式中,我们相当明确地执行上述操作,并将对象引用转化为变量(
    fig
    ax
    li
    )。引用在有状态接口中也不会丢失,但它们隐藏在
    matplotlib
    中的某个地方

    当我们尝试更改某些属性(例如图形的大小)时,这种差异变得明显。使用OO方法:

    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    li = ax.plot([0,1], [1,0])
    
    fig.set_size_inches([10, 8])
    
    使用有状态方法,我们首先需要找到图形<代码>plt.gcf。因此:

    plt.gcf().set_size_inches([10,8])
    
    这几乎是一回事。在我们同时打开多个图形的情况下,“几乎”部分变得非常重要
    plt.gcf
    返回“当前”数字,但很难判断哪个是当前数字

    同样的情况在轴或线上重复出现。如果要调整绘图的x刻度,则:

    ax.set_xticks([0,.5,1])
    
    这很简单。通过有状态方法,它变成:

    plt.gca().set_xticks([0, .5, 1])
    
    其中
    gca()
    返回“当前”轴。如果您有几个子地块,这将变得相当复杂

    所以,问题是谁拿着这些东西。有状态接口只是面向对象信息的薄包装。所有参数都在对象中,一个绘图中有许多对象(数百个,甚至数千个)

    matplotlib
    有状态接口的一点是,它经常与运行在
    IPython
    中的
    pylab
    一起使用。这提供了有状态接口和一些带有名称空间的快捷方式。绘制正弦曲线非常简单:

    x = linspace(0, 2*pi, 100)
    plot(x, sin(x))
    
    这可以说比:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 2*np.pi, 100)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    li = ax.plot(x, np.sin(x))
    

    但是,
    pylab
    提供的快捷方式在交互式工作中非常方便,但在脚本中并不好用。我也使用了
    pylab
    ,但我以面向对象的形式展示了几乎所有与
    matplotlib
    相关的答案,因为它更加透明。

    有一个很好的解释。除了在CS/编程领域之外,我在英语语言的其他任何地方都没有见过这个词。也许有人会更清楚…是matplotlib记住了你绘制的数字。除非你说
    plt.close()
    。当您打印少量图像时,这不是一个大问题,但当运行循环并打印许多图像时,它将消耗大量内存。我不知道matplotlib,但通常有状态意味着记录了某些状态,这是当前“会话”中隐含的一种上下文。我通常认为有状态与无状态相反,在每次调用/使用时,您必须提供完整的上下文,因为它没有被保留。如果您可以附加pyplot教程的url进行确认,这是一个快速注释。这是一个很好的示例,但这个答案部分是不正确的:
    matplotlib.pyplot.figure
    ,虽然看起来更像OOP,但仍然提供绑定到
    pyplot
    的有状态绘图实例
    matplotlib.figure.figure
    将返回无状态版本。