%pylab是什么?

88
我经常看到人们在各种代码片段中使用 %pylab,特别是在iPython中。然而,在我所拥有的《学习Python》(Learning Python)和其他几本Python书籍中,我找不到任何提到 %pylab 的地方,也不确定它是什么意思。我相信答案很简单,但有谁能启发我一下吗?
5个回答

84

%pylabipython 中的一个 魔法函数

在 ipython 中,魔法函数总是以百分号(%)开头,后面紧跟着一个小文本字符串,没有任何空格;实际上,ipython 魔法函数定义了一些特别适用于交互式工作的快捷方式,例如,为了让您了解魔法函数在 python 中是如何工作的,以下是我最喜欢的几个:

  • to view cwd directory contents:

    %ls   
    
  • to run a script in ipython using an empty namespace, type space then a script name:

    %run     
    
  • to execute a code snippet (particularly for multi-line snippets which would usually cause an _IndentationError_ to be thrown):

    %paste
    
当在IPython提示符处输入%pylab魔法函数时,它会触发Matplotlib中各种模块的导入。
哪些模块呢?嗯,那些被pylab接口包含的模块。
令人惊叹的Matplotlib绘图库有两个不同的接口:一个是Pythonic接口,另一个是最初为在交互提示符下绘图而设计的类似于MATLAB的接口。
前者通常这样导入:
from matplotlib import pyplot as PLT

实际上,pyplot有自己的神奇python函数。

%pyplot

为什么有两个不同的接口?Matplotlib最初的接口是pylab,后来才添加了Pythonic接口。当该项目开始时,脚本编写和应用开发并不是Matplotlib的主要使用场景,而是在Python shell中进行绘图。

显然,John Hunter(Matplotlib的创建者)想要在Python中包含交互式绘图,因此他向Fernando Perez(FP)的IPython项目提交了一个补丁。当时FP是博士生,并告知JH他无法立即审核该补丁。因此,JH创建了Matplotlib。这意味着Matplotlib始于基于shell的绘图方案。

pylab接口确实更适合交互式工作:

from pylab import *

x, y = arange(10), cos(x/2)
plot(x, y)
show()

并使用pyplot接口:

from matplotlib import pyplot as PLT
import numpy as NP

x, y = NP.arange(10), NP.cos(x/2)
fig = PLT.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y)
PLT.show()

7
起初我并没有真正理解这些内容,后来我发现这个资源更为清晰易懂:https://ipython.org/ipython-doc/dev/interactive/magics.html。 - Ryan

63

%pylab是将下面所有命令的快捷方式——实质上将numpy和matplotlib添加到会话中。这被纳入iPython作为过渡工具,当前的建议是不要使用它。核心原因是以下命令集太多地导入了全局命名空间,而且它们不允许您将matplotlib的模式从UI更改为QT或其他模式。您可以在这里看到这背后的历史和原因。

%pylab的作用:

import numpy
import matplotlib
from matplotlib import pylab, mlab, pyplot
np = numpy
plt = pyplot

from IPython.core.pylabtools import figsize, getfigs

from pylab import *
from numpy import *

这是我在笔记本开头使用的替代方法:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

6
好的回答!但是 inline 是什么作用? - Rachel
12
inline 可以让你在当前页面中嵌入图形,而不是在新的窗口或终端中打开,想要查看效果可以去掉 inline - yosemite_k
感谢您的解释,非常有用。 - Luke Davis
谢谢提供信息,但我完全讨厌这个包现在覆盖了那么多Python内置函数,以至于你不能再写Python代码了 - 比如对生成器使用sum :-( - dsz

8

关于IPython魔法函数的更近一步文档请参考这里

魔法函数通常以类似于shell的语法形式出现,但实际上是Python函数。其语法和赋值方式类似于感叹号(!)语法,但具有更高的灵活性和功能。魔法函数以百分号(%)或双百分号(%%)开头。

关于IPython魔法函数的更多信息,请参考这里,特别是关于%pylab魔法的信息请参考这里

 %pylab [--no-import-all] [gui]

加载 numpy 和 matplotlib 以进行交互式工作。

此函数使您可以在 IPython 会话的任何时候激活 pylab(matplotlib、numpy 和交互支持)。

%pylab 进行以下导入:

import numpy
import matplotlib
from matplotlib import pylab, mlab, pyplot
np = numpy
plt = pyplot

from IPython.display import display
from IPython.core.pylabtools import figsize, getfigs

from pylab import *
from numpy import *

6

%pylab 是一个“魔法函数”,你可以在IPython中或交互式Python中调用它。通过调用它,IPython解释器将导入matplotlibNumPy模块,以便您方便地访问它们的函数。例如,

rich@rich-ubuntu:~/working/fb_recruit/working$ ipython
Python 2.7.6 |Anaconda 1.8.0 (64-bit)| (default, Nov 11 2013, 10:47:18) 
Type "copyright", "credits" or "license" for more information.

IPython 1.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: arange(4)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-2e43d7eb1b3e> in <module>()
----> 1 arange(4)

NameError: name 'arange' is not defined

In [2]: %pylab
Using matplotlib backend: Qt4Agg
Populating the interactive namespace from numpy and matplotlib

In [3]: arange(4)
Out[3]: array([0, 1, 2, 3])

In [4]: 

所以,如果OP想要了解更多关于这个问题的内容,他们可以搜索“pylab魔术函数ipython”。 - SethMMorton

5

Pylab是一个类似MATLAB的Python数学前端工具。iPython对Pylab有特定的支持,可以使用%pylab魔术命令调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接