IPython
IPython (交互式python命令行工具)是一种增强型python shell软件。 它给用户提供了更具鲁棒性和效率性的开发环境。
其中,它的几个关键特性与标准python shell不同。
命令历史
ipython中,你所有的输入输出都会被保存(这比标准python shell高级多了)。它提供了两个变量In和Out分别存储你的输入输出。 所有输出自动保存到变量_N 其中N为输出cell的序号。类似地,输入的文本保存到_iN变量中。这可以帮助你很快恢复你的输入输出。所以最好不要使用同样的变量名覆盖掉你的输入输出。
import numpy as np
np.sin(4)**2
0.57275001690430671
_1
0.57275001690430671
_i1
'import numpy as np\nnp.sin(4)**2'
_1 / 4.
0.14318750422607668
异步输出
所有输出文本,相对于从kernel产生的数据而言,显示的过程是异步的。
如果执行下面的代码,你会看到它是逐步从0显示到7的,而不是一下全部打印出来。
这可能在系统编程时有用。
import time, sys
for i in range(8):
print(i)
time.sleep(0.5)
0
1
2
3
4
5
6
7
自省
如果想要显示任何当前python对象的函数和功能,可以使用?来获得对象的详细信息。
some_dict = {}
some_dict?
想要了解更多细节的话,使用??。它能提供更多细节,甚至包括对象本身的源代码。
from numpy.linalg import cholesky
cholesky??
这一语法还可以用来搜索命名空间。只要你用*号扩住名称后加上?即可。
如 *sdfsf*?
%matplotlib inline
import pylab as plt
plt.*plot*?
自动补全
由于ipython支持自省,所以它可以提供自动补全功能。当你输入部分变量名时,按下tab键便可以得到提示。
当然,在你输入命令的过程中的任意时刻,按下tab键也会得到对应的提示。
np.ar
plt.hist
系统命令工具
在ipython中,使用常用cd, ls, 等命令都不是问题。
ls /Users/fonnescj/Teaching/Bios8366/data
在系统命令前加上!后就可以使用,得到的效果根据操作系统不同而变化。
!locate python | grep pdf
甚至可以使用python变量作为命令发送给操作系统
file_type = 'csv'
!ls ../data/*$file_type
../data/baseball.csv
../data/cancer.csv
../data/cdystonia.csv
../data/microbiome.csv
../data/microbiome_missing.csv
../data/test_scores.csv
../data/vlbw.csv
系统命令的输出还可以保存到python变量中
data_files = !ls ../data/microbiome/
data_files
['MID1.xls',
'MID2.xls',
'MID3.xls',
'MID4.xls',
'MID5.xls',
'MID6.xls',
'MID7.xls',
'MID8.xls',
'MID9.xls',
'metadata.xls']
Qt Console
可以使用命令$ jupyter qtconsole 启动。
启动后,这一工具相当于增强型的ipython,我管它叫iipython。
它支持多行编辑,彩色高亮,直接显示图片到输出行,一个内核多个qtconsole等特性
$ jupyter qtconsole
Jupyter Notebook
毫不客气地说,ipython团队颠覆了文档编辑工具届。
只要有浏览器和ipython,你的文件编辑不会有任何问题,特别是脚本语言相关文件的编辑。
javascript, julia, ruby都能运行在jupyter notebook中。
jupyter notebook的前身是 ipython notebook。 这一工具做的非常好,以至于其他语言社区都想要自己的notebook。
所以ipython 原团队将ipython notebook整合起来独立成立了jupyter项目。
回顾前十年这一团队的成就。可以看到,他们的努力为编程语言的推广作出了重要贡献。
他们主要由以下成就:
* an interactive shell
* a REPL protocol
* a notebook document fromat
* a notebook document conversion tool
* a web-based notebook authoring tool
* tools for building interactive UI (widgets)
* interactive parallel Python
notebook项目支持交互式数据显示和高性能并行计算。
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight') # 样式风格
def f(x):
return (x-3)*(x-5)*(x-7)+85
import numpy as np
x = np.linspace(0, 10, 200)
y = f(x)
plt.plot(x,y)
[<matplotlib.lines.Line2D at 0x85530b8>]
notebook 使你用html或markdown轻松编辑文件。
notebook主要由两个部分组成:
* 利用json格式记录代码和富文本
* 网页式交互
启动命令 $ jupyter notebook
这一命令初始化了ipython引擎,一个python实例利用网络进行命令和运行结果的传递。
ipython controller 提供交互界面与多个ipython client进行连接。
当然,notebook包含一个网页编辑器,其他网页能做的,notebook也可以。
比如显示网页。
from IPython.display import HTML
HTML("<iframe src=http://blog.csdn.net/myjiayan width=700 height=350></iframe>")
src="http://blog.csdn.net/myjiayan" width="700" height="350"> 还可以显示视频。
from IPython.display import YouTubeVideo # if you cannot cross the ***, you cannot load it
YouTubeVideo("rl5DaFbLc60")
<iframe
width="400"
height="300"
src="https://www.youtube.com/embed/rl5DaFbLc60"
frameborder="0"
allowfullscreen
></iframe>
远程编辑代码
使用命令 %load 可以载入远程代码
# %load http://matplotlib.org/mpl_examples/shapes_and_collections/scatter_demo.py
""" Simple demo of a scatter plot. """
import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
数学公式显示
利用Mathjax可以轻松显示数学公式。
Mathjax 是javascript实现的latex语法的公式显示工具。这些公式可以轻易嵌入html。
"""$$ \int_{a}^{b} f(x)\, dx \approx \frac{1}{2} \sum_{k=1}^{N} \left( x_{k} - x_{k-1} \right) \left( f(x_{k}) + f(x_{k-1}) \right). $$"""
显示为:
sympy 支持
sympy是符号计算工具。
它支持:
* 多项式
* 微积分
* 解方程
* 离散数学
* 矩阵
from sympy import *
init_printing()
x, y = symbols("x y")
eq = ((x+y)**2 * (x+1))
eq
expand(eq)
(1/cos(x)).series(x, 0, 6)
limit((sin(x)-x)/x**3, x, 0)
diff(cos(x**2)**2 / (1+x), x)
魔法函数
ipython 还有一系列魔法函数。
* %run
* %edit
* %debug
* %timeit
* %paste
* %load_ext
* %load
等。
%lsmagic
Available line magics:
%alias %alias_magic %autocall %automagic %autosave %bookmark %cd %clear %cls %colors %config %connect_info %copy %ddir %debug %dhist %dirs %doctest_mode %echo %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %ldir %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %macro %magic %matplotlib %mkdir %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %ren %rep %rerun %reset %reset_selective %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%cmd %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Automagic is ON, % prefix IS NOT needed for line magics.
%timeit 进行当前行代码的时间评测
%%timeit 进行当前cell代码的时间评测
%timeit np.linalg.eigvals(np.random.rand(100,100))
The slowest run took 17.40 times longer than the fastest. This could mean that an intermediate result is being cached.
1 loop, best of 3: 21.9 ms per loop
%%timeit a = np.random.rand(100, 100)
np.linalg.eigvals(a)
10 loops, best of 3: 21.1 ms per loop
ipython 还支持部分其他脚本语言的运行。
记得在,其他编程语言前,输入 %%script <name>
%%ruby puts "Hello from Ruby #{RUBY_VERSION}"
%%bash
echo "hello from $BASH"
hello from /bin/bash
rpy2扩展。通过rpy2可以调用R代码。
%load_ext rpy2.ipython
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: No module named 'rpy2'
如果上面代码报错,那么一定是你没装rpy2库。在使用下面命令安装前,要装Rstudio。
!pip install rpy2
x,y = np.arange(10), np.random.normal(size=10)
%R print(lm(rnorm(10)~rnorm(10)))
下面的代码中-i表示输入,-o表示输出。
%%R -i x,y -o XYcoef
lm.fit <- lm(y~x)
par(mfrow=c(2,2))
print(summary(lm.fit))
plot(lm.fit)
XYcoef <- coef(lm.fit)
XYcoef
LaTex 支持
使用 %latex
直接进行编辑公式
%%latex
\begin{align}
\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\
\nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
\nabla \cdot \vec{\mathbf{B}} & = 0
\end{align}
Javscript
Javascript支持。
在进行数据可视化过程中,还要常常用到D3库。
%%javascript
alert("Hello world!");
<IPython.core.display.Javascript object>
导出文件或转化文件格式
文件格式支持:markdown,pdf,html,rst,.py文件。
将 .ipynb
文件通过命令 nbconvert
转换为各种格式的文件。
!jupyter nbconvert --to html Section0-IPython_and_Jupyter.ipynb
当前,支持的文件类型为:HTML, LaTeX,Markdown,reStructuredText, Python, HTML5 slides。
而pdf文件是经过LaTeX转化来的。 详见 Pandoc
!jupyter nbconvert --to pdf Section2_1-Introduction-to-Pandas.ipynb
IPython Notebook Viewer 支持在线浏览notebook,很适合分享文件。
%%html
<iframe src=http://nbviewer.ipython.org/2352771 width=700 height=300></iframe>
GitHub 也支持ipnb文件的渲染。风格比csdn好看多了。
可重现研究
可重现研究的基本要求就是对数据的获得分析过程要有详尽的描述(包含编写的代码)。这样,你获得的结果就可以被别人精确的重复。
如果韩春雨老师有这点认识可能社会对他就不会有如今这么大的争议。
实际上,科学数据越来越大越来越复杂,要实现可重现研究简单描述是不够的。
目前来说,大多数现代的科研如果没有作出很大的努力的话,是不太可能可重现的。
技术壁垒已经凸显。比如,google的deepmind公司使用的神经网络计算集群,很少有机构(国内中科院应该有)能有同等效率计算基础设施, 神经网络的相关参数也是不得而知的。
所以重现alphago,国内近期几乎是不太可能的。
科学计算工作流程
其主要包含一下过程:
jupyter 项目的存在使得科学计算变得更加具有可重复性。
并行ipython
并行ipython主要由三个部分组成。
- 引擎(engine) - 远程或分布式进程。程序在这里运行
- 客户端(client) - 与引擎的接口
- 控制器(controller) - 进行引擎与客户端的协调。
这些组成部分位于IPython.parallel包中,但是它现在独立出来了。
安装方法是:
pip install ipyparallel
conda install ipyparallel
如果想要安装IPython Cluster tab 到jupyter notebook。
需要在文件jupyter_notebook_config.py后面加入以下代码:
c.NotebookApp.server_extension.append('ipyparallel.nbextension')
这个文件位于~/.jupyter文件夹内。
运行下面代码之前,请先启动cluster,可以使用
ipcluster start
开始。
下面是一些功能选项。
ipcluster nbextension enable
ipcluster nbextension disable
遇到权限问题可以使用:
sudo chmod -R 777 ~/.jupyter
from ipyparallel import Client
client = Client()
dv = client.direct_view()
len(dv)
4
def where_am_i():
import os
import socket
return "In process with pid {0} on host: '{1}'".format(
os.getpid(), socket.gethostname())
where_am_i_direct_results = dv.apply(where_am_i)
where_am_i_direct_results.get()
["In process with pid 17151 on host: 'wm'",
"In process with pid 17150 on host: 'wm'",
"In process with pid 17144 on host: 'wm'",
"In process with pid 17145 on host: 'wm'"]
如果本文对您有帮助,请不吝打赏。学生伤不起。
参考文献
http://stronginference.com/ Chris Fonnesbeck, a great teacher! https://twitter.com/fonnesbeck
IPython Notebook Viewer Displays static HTML versions of notebooks, and includes a gallery of notebook examples.
NotebookCloud A service that allows you to launch and control IPython Notebook servers on Amazon EC2 from your browser.
A Reference-Free Algorithm for Computational Normalization of Shotgun Sequencing Data A landmark example of reproducible research in genomics: Git repo, iPython notebook, data and scripts.
Jacques Ravel and K Eric Wommack. 2014. All Hail Reproducibility in Microbiome Research. Microbiome, 2:8.
Benjamin Ragan-Kelley et al.. 2013. Collaborative cloud-enabled tools allow rapid, reproducible biological insights. The ISME Journal, 7, 461–464; doi:10.1038/ismej.2012.123;