《scikit-learn机器学习常用算法原理及编程实战》—2.2 IPython简介

举报
华章计算机 发表于 2019/05/31 16:07:46 2019/05/31
【摘要】 本书摘自《scikit-learn机器学习常用算法原理及编程实战》一书中的第2章,第2.2.1节,编著是黄永昌 .

2.2  IPython简介

  IPython是公认的现代科学计算中最重要的Python工具之一。它是一个加强版的Python交互式命令行工具,与系统自带的Python交互环境相比,IPython具有以下明显的几个特点:

* 与Shell紧密关联,可以在IPython环境下直接执行Shell指令;

* 可以直接绘图操作的Web GUI环境,在机器学习领域、探索数据模式、可视化数据、绘制学习曲线时,这一功能特别有用;

* 更强大的交互功能,包括内省、Tab键自动完成、魔术命令等。

2.2.1  IPython基础 

  如果你之前没有接触过IPython,那么现在是打开计算机体验IPython的绝好时机,这种提高工作效率类的软件,单单看书是完全无法体验它的威力和便利性的。

  正确安装IPython后,在命令行输入ipython即可启动IPython交互环境。

  

  $ ipython

  Python 2.7.10 (default, Jul 30 2016, 19:40:32)

  Type "copyright", "credits" or "license" for more information.

  

  IPython 5.3.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]:

  

  基本上,可以像使用Python交互环境一样使用IPython交互环境:

  

  In [1]: a = 5

  

  In [2]: a + 3

  Out[2]: 8

  

  跟Python交互环境相比,IPython的输出排版更简洁、优美:

  

  In [3]: import numpy as np

  

  In [4]: data = {i: np.random.randn() for i in range(8)}

  

  In [5]: data

  Out[5]:

  {0: -0.12696712293771154,

   1: -0.9291628055121173,

   2: 0.8248356377337012,

   3: -0.5381098900612056,

   4: 2.0246437691867816,

   5: -2.089016766007329,

   6: 1.234086243284236,

   7: 0.39953080301369065}

  

  对比一下标准的Python交互环境下的输出:

  

  >>> import numpy as np

  >>> data = {i: np.random.randn() for i in range(8)}

  >>> data

  {0: -0.7989884322559587, 1: 0.2275777042011071, 2: 0.012864065192735426, 

  3: -1.3183480226587958, 4: -0.9149466170543599, 5: -0.683377363404726, 6: 

  -0.8964451905483575, 7: -0.37082447512220285}

  >>>

  

  很多时候,并不是我们不懂审美,而是没有机会发现美。此外,IPython的Tab键自动补全功能是提高效率的秘籍。例如,输入np.random.rand命令后,按Tab键,会自动显示np.random命名空间下以rand开头的所有函数。这一功能的便利性赶上了主流IDE。

  

  In [6]: np.random.rand<TAB>

  np.random.rand              np.random.random

  np.random.randint          np.random.random_integers

  np.random.randn              np.random.random_sample

  

  记住一些快捷键,可以让你在IPython环境***验健步如飞的感觉。对于熟悉Shell命令的读者,这些命令会有似曾相识的感觉。

* Ctrl+A:移动光标到本行的开头;

* Ctrl+E:移动光标到本行的结尾;

* Ctrl+U:删除光标所在位置之前的所有字符;

* Ctrl+K:删除光标所在位置之后的所有字符,包含当前光标所在的字符;

* Ctrl+L:清除当前屏幕上显示的内容;

* Ctrl+P:以当前输入的字符作为命令的起始字符,在历史记录里向后搜索匹配的命令;

* Ctrl+N:以当前输入的字符作为命令的起始字符,在历史记录里向前搜索匹配的命令;

* Ctrl+C:中断当前脚本的执行。

  另外,IPython提供了强大的内省功能。在Python交互环境里,只能使用help()函数来查阅内置文档,在IPython环境里可以直接在类或变量后面加上一个问号“?”来查阅文档:

  

  In [7]: np.random.randn?

  Docstring:

  randn(d0, d1, ..., dn)

  

  Return a sample (or samples) from the "standard normal" distribution.

  ... ...

  

  在类或变量或函数后面加两个问号“??”还可以直接查看源代码。结合星号“*”和问号“?”,还可以查询命名空间里的所有函数和对象。例如,查询np.random下面以rand开头的所有函数和对象:

  

  In [12]: np.random.rand*?

  np.random.rand

  np.random.randint

  np.random.randn

  np.random.random

  np.random.random_integers

  np.random.random_sample

  

  从这些特性可以看出来,IPython鼓励探索性编程。即当你对环境还不熟悉的时候,允许通过简便快捷的方式来找到你想找的信息。

  除此之外,IPython还提供了强大的魔术命令。例如,我们在当前工作目录下有一个叫hello.py的文件,其内容为:

  

  msg = 'hello ipython'

  print(msg)

  

  然后在IPython里输入%run hello.py命令即可直接运行这个python文件。这个文件是在一个空的命名空间里运行的,并且运行之后,该文件里定义的全局变量和函数就会自动引用到当前IPython空间中。

  In [13]: %run hello.py

  hello ipython

  

  In [14]: msg

  Out[14]: 'hello ipython'

  

  还有一个常用的魔术命令是%timeit,可以用来快速评估代码的执行效率。例如,下面的代码用来评估一个100 ? 100的矩阵点乘所需要运行的时间。

  

  In [15]: a = np.random.randn(100, 100)

  In [16]: %timeit np.dot(a, a)

  1 loops, best of 3: 261 us per loop

  

  还可以使用%who或%whos命令来查看当前环境下的变量列表。

  

  In [17]: %who

  a          msg     np

  

  In [18]: %whos

  Variable  Type       Data/Info

  -------------------------------

  a          ndarray    100x100: 10000 elems, type `float64`, 80000 bytes

  msg        str        hello ipython

  np         module     <module 'numpy' from 'C:\<...>ages\numpy\__init__.pyc'>

  

  还有一些比较常用的魔术命令如下。

* %quickref:显示IPython的快速参考文档;

* %magic:显示所有的魔术命令及其详细文档;

* %reset:删除当前环境下的所有变量和导入的模块;

* %logstart:开始记录IPython里的所有输入的命令,默认保存在当前工作目录的 ipython_log.py中;

* %logstop:停止记录,并关闭log文件。

  需要说明的是,在魔术命令后面加上问号“?”可以直接显示魔术命令的文档。我们来查看%reset魔术命令的文档。

  

  In [28]: %reset?

  Docstring:

  Resets the namespace by removing all names defined by the user, if

  called without arguments, or by removing some types of objects, such

  as everything currently in IPython's In[] and Out[] containers (see

  the parameters for details).

  

  IPython与shell交互的能力,可以让我们不离开IPython环境即可完成很多与操作系统相关的功能,特别是在Linux/Mac OSX系统下工作时。最简单的方式,就是在命令前加上感叹号“!”即可直接运行shell命令(Windows系统下运行cmd命令)。比如下面的命令可以很方便地在IPython交互环境下打印出网络地址:

  

  In [36]: !ifconfig | grep "inet "

      inet 127.0.0.1 netmask 0xff000000

      inet 192.168.1.103 netmask 0xffffff00 broadcast 192.168.1.255

  以感叹号为前缀的shell命令是和操作系统相关的,Windows系统和Linux/Mac OSX系统相差很大。当使用%automagic on启用自动魔术命令功能后,可以省略百分号“%”的输入即可直接运行魔术命令:

  

  In [68]: %automagic on

  

  Automagic is ON, % prefix IS NOT needed for line magics.

  

  In [69]: pwd

  Out[69]: u'/Users/kamidox'

  

  In [70]: ls

  Applications/        Pictures/            lab/

  Desktop/            Public/              osx/

  Documents/          android/            scikit_learn_data/

  Downloads/          bin/                tools/

  

  In [71]: cd lab

  /Users/kamidox/lab

  

  In [72]: pwd

  Out[72]: u'/Users/kamidox/lab'

  

  我们经常会用import命令导入自己写的python模块,在调试过程中,修改了这个模块后,如果想让当前的修改马上起作用,必须使用reload()函数重新载入该模块。假设当前工作目录下有一个名字为hello.py的文件,其内容为:

  

  def say_hello():

      print('hello ipython')

  

  导入模块,并运行say_hello()函数:

  

  In [84]: import hello

  

  In [85]: hello.say_hello()

  hello ipython

  

  把hello.py文件内容改为下面的内容并保存:

  

  def say_hello():

      print('ipython is a great tool')

  

  此时,如果直接调用say_hello()函数,得到的依然是旧的输出,只有调用reload()函数重新载入模块,才能得到最新的输出:

  

  In [86]: hello.say_hello()

  hello ipython

  

  In [87]: reload(hello)

  Out[87]: <module 'hello' from 'hello.py'>

  

  In [88]: hello.say_hello()

  ipython is a great tool


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。