Jupyter Notebook 的 28 個(gè)技巧(下)
我們繼續(xù)接著上篇文章進(jìn)行,分享后面的 14 條實(shí)用小技巧。
15. IPython Magic - 高分辨率的圖形輸出
IPython 的魔術(shù)命令只需要一行代碼,就可以讓你的圖形輸出在 Retina 屏幕(例如新款的 MacBook)上獲得雙倍的精度。「注意:下面這個(gè)例子在非 Retina 的屏幕上不會(huì)生效」
x?=?range(1000)
y?=?[i?**?2?for?i?in?x]
plt.plot(x,y)
plt.show();
%config?InlineBackend.figure_format?='retina'
plt.plot(x,y)
plt.show();


16. 抑制函數(shù)的輸出內(nèi)容
有時(shí)候在最后一行抑制函數(shù)的輸出是很方便的,例如在繪圖時(shí)。要實(shí)現(xiàn)整個(gè)目標(biāo),你只需要在最后添加一個(gè)分號(hào)就可以。
%matplotlib?inline
from?matplotlib?import?pyplot?as?plt
import?numpy
x?=?numpy.linspace(0,?1,?1000)**1.5
#?這樣執(zhí)行會(huì)得到下面的輸出和圖形。
plt.hist(x)
(array([?216.,?126.,?106.,?95.,?87.,?81.,?77.,?73.,?71.,?68.]),?array([?0.?,?0.1,?0.2,?0.3,?0.4,?0.5,?0.6,?0.7,?0.8,?0.9,?1.?]),
10?Patch?objects>)

#?通過(guò)添加一個(gè)分號(hào)在后面,就可以抑制這段輸出。
plt.hist(x);

17. 執(zhí)行 shell 命令
從你的 notebook 中執(zhí)行 shell 命令是很簡(jiǎn)單的。你可以直接使用下面的命令去檢查當(dāng)前文件夾中可用的數(shù)據(jù)集:
!ls?*.csv
nba_2016.csv?titanic.csv?pixar_movies.csv?whitehouse_employees.csv
或者去檢查和管理包。
!pip?install?numpy?!pip?list?|?grep?pandas
Requirement?already?satisfied?(use?--upgrade?to?upgrade):?numpy?in?/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages?pandas?(0.18.1)
18. 使用 LaTeX 編輯公式
當(dāng)你在一個(gè) Markdown 的塊中寫 LaTeX 代碼時(shí),它可以使用 MathJax 渲染成目標(biāo)公式。
這個(gè):
$P(A?\mid?B)?=?\frac{P(B?\mid?A)P(A)}{P(B)}$
將會(huì)變成這個(gè):

Markdown 在 notebook 中是很重要的一部分內(nèi)容,所以不要忘記去使用它豐富的表現(xiàn)能力。
19. 在 notebook 中使用不同的內(nèi)核運(yùn)行代碼
只要你想,你就可以將不同內(nèi)核上的代碼結(jié)合到一個(gè) notebook 中來(lái)。
你只需要在每個(gè)代碼的開始處使用 IPython 的魔術(shù)命令,命令內(nèi)容為你想要使用的內(nèi)核的名稱。
%%bash%%HTML%%python2%%python3%%ruby%%perl
%%bash
for?i?in?{1..5}
do?echo?"i?is?$i"
done
i?is?1
i?is?2
i?is?3
i?is?4
i?is?5
20. 為 Jupyter 安裝其它內(nèi)核
Jupyter 有一個(gè)非常好的特性就是可以為不同語(yǔ)言運(yùn)行內(nèi)核。舉個(gè)栗子,下面就是如何去安裝和運(yùn)行 R 內(nèi)核。
簡(jiǎn)單選項(xiàng):使用 Anaconda 安裝 R
如果你是使用 Anaconda 來(lái)管理你的環(huán)境,那么安裝 R 就是很簡(jiǎn)單的事情。只需要運(yùn)行下面的代碼就可以:
conda?install?-c?r?r-essentials
復(fù)雜選項(xiàng):手動(dòng)安裝 R 內(nèi)核
如果你沒(méi)有使用 Anaconda,這個(gè)過(guò)程會(huì)略微復(fù)雜一點(diǎn)。首先,如果你沒(méi)有安裝 R 的話先從 CRAN 中安裝 R。
完成上面的安裝后,啟動(dòng) R 控制臺(tái)并運(yùn)行下面的命令:
install.packages(c('repr',?'IRdisplay',?'crayon',?'pbdZMQ',?'devtools'))
devtools::install_github('IRkernel/IRkernel')
IRkernel::installspec()?#?to?register?the?kernel?in?the?current?R?installation
21. 在同一個(gè) notebook 中同時(shí)運(yùn)行 R 和 Python
最好的解決方案就是安裝 rpy2(還需要一個(gè) R 的工作版本),具體實(shí)現(xiàn)可以用 pip 很輕松的完成:
pip?install?rpy2
你可以同時(shí)使用兩種語(yǔ)言,甚至在內(nèi)部傳遞變量:
%load_ext?rpy2.ipython
%R?require(ggplot2)
array([1],?dtype=int32)
import?pandas?as?pd?
df?=?pd.DataFrame({
'Letter':?['a',?'a',?'a',?'b',?'b',?'b',?'c',?'c',?'c'],
'X':?[4,?3,?5,?2,?1,?7,?7,?5,?9],
'Y':?[0,?4,?3,?6,?7,?10,?11,?9,?13],
'Z':?[1,?2,?3,?1,?2,?3,?1,?2,?3]
})
%%R?-i?df?ggplot(data?=?df)?+?geom_point(aes(x?=?X,?y=?Y,?color?=?Letter,?size?=?Z))

實(shí)例出處 「Revolutions Blog[1]」
22. 用另外一種語(yǔ)言寫函數(shù)
有時(shí)候 numpy 的速度還是不太夠,我需要去寫一些更快的代碼。
原則上,你可以在動(dòng)態(tài)庫(kù)中編譯函數(shù)并編寫 python 裝飾器...
但是當(dāng)這個(gè)無(wú)聊的部分已經(jīng)為你完成時(shí),是不是會(huì)感覺(jué)非常棒?
你可以在 cython 或者 fortran 中寫你的函數(shù),然后直接在 python 代碼中使用它們。
首先,你需要安裝:
!pip?install?cython?fortran-magic
%load_ext?Cython
%%cython
def?myltiply_by_2(float?x):
return?2.0?*?x
myltiply_by_2(23.)
我個(gè)人比較喜歡使用 fortran,因?yàn)楫?dāng)寫一些數(shù)字運(yùn)算的函數(shù)時(shí)非常方便。更多的fortran使用細(xì)節(jié)[2]你可以在這里查閱。
%load_ext?fortranmagic
%%fortran?subroutine?compute_fortran(x,?y,?z)
real,?intent(in)?::?x(:),?y(:)
real,?intent(out)?::?z(size(x,?1))
z?=?sin(x?+?y)
end?subroutine?compute_fortran
compute_fortran([1,?2,?3],?[4,?5,?6])
同樣還有一些其它系統(tǒng)方法可以加速你的 python 代碼。更多的例子點(diǎn)擊這里查看:加速python細(xì)節(jié)[3]。
23. ?多行光標(biāo)操作
Jupyter 支持多光標(biāo)操作,類似于 Sublime Text。按下 Alt 鍵的同時(shí),直接點(diǎn)擊并拖動(dòng)鼠標(biāo)選取。

24. Jupyter-contrib extensions
Jupyter-contrib extensions[4] 是一個(gè)擴(kuò)展包集合,給 Jupyter 提供了更多的功能,例如包括拼寫檢查和代碼格式。
下面的命令將會(huì)安裝擴(kuò)展包,和一個(gè)基于菜單的配置程序,幫助你在 Jupyter 的主屏幕瀏覽和啟動(dòng)擴(kuò)展包。
!pip?install?https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tarball/master?!pip?install?jupyter_nbextensions_configurator?!jupyter?contrib?nbextension?install?--user?!jupyter?nbextensions_configurator?enable?--user

25. 從 Jupyter notebook 創(chuàng)建一個(gè)展示結(jié)果
Damian Avila 的作品 RISE[5] 可以讓你從已有的 notebook 中創(chuàng)建一個(gè) PPT 風(fēng)格的展示結(jié)果。
你可以使用 conda 安裝 RISE:
conda?install?-c?damianavila82?rise
或者換成 pip 安裝:
pip?install?RISE
然后運(yùn)行下面的命令來(lái)安裝和啟用這個(gè)擴(kuò)展包:
jupyter-nbextension?install?rise?--py?--sys-prefix?jupyter-nbextension?enable?rise?--py?--sys-prefix
26. Jupyter 的輸出系統(tǒng)
notebook 顯示為 HTML,并且代碼塊的輸出也可以是 HTML,因此你可以在輸出時(shí)返回任何結(jié)果:視頻/音頻/圖片。
在這個(gè)例子中,我掃描了倉(cāng)庫(kù)中包含圖片的一個(gè)文件夾,并且展示了前五幅縮略圖:
import?os
from?IPython.display?import?display,?Image?
names?=?[f?for?f?in?os.listdir('../images/ml_demonstrations/')?if?f.endswith('.png')]
for?name?in?names[:5]:
?display(Image('../images/ml_demonstrations/'?+?name,?width=100))





我們可以用 bash 命令創(chuàng)建一個(gè)同樣的 list,因?yàn)槟g(shù)命令和 bash 調(diào)用返回 python 變量:
names?=?!ls?../images/ml_demonstrations/*.png?names[:5]
['../images/ml_demonstrations/colah_embeddings.png',
'../images/ml_demonstrations/convnetjs.png',
'../images/ml_demonstrations/decision_tree.png',
'../images/ml_demonstrations/decision_tree_in_course.png',
'../images/ml_demonstrations/dream_mnist.png']
27. 大數(shù)據(jù)分析
有許多方法在查詢/處理大數(shù)據(jù)時(shí)是可用的:
ipyparallel (以前的 ipython 集群)[6] 在處理 python 中的 map-reduce 操作時(shí),是一個(gè)很好的選擇。我們?cè)?rep[7] 中使用它并行訓(xùn)練機(jī)器學(xué)習(xí)模型。 pyspark[8] spark-sql 魔術(shù)命令 %%sql[9]
28. 分享 notebook
分享你的 notebook 最簡(jiǎn)單的方法就是使用 notebook 文件(.ipynb),但是對(duì)那些不使用 Jupyter 的人來(lái)說(shuō),你仍然有一些其它選擇:
使用 File > Download as > HTML菜單選項(xiàng)來(lái)將你的 notebook 轉(zhuǎn)化為 HTML 文件。上傳你的 .ipynb 文件到 Google Colab[10]。 以 gists 的形式分享你的 notebook 文件或者上傳到 GitHub,無(wú)論哪種方式都可以渲染你的 notebook。看這個(gè) git 分享的例子[11]。 如果你選擇將 notebook 上傳到 GitHub 上,你可以使用 mybinder[12] 服務(wù)來(lái)允許某人有權(quán)限訪問(wèn)你的倉(cāng)庫(kù)。 利用 jupyterhub[13] 來(lái)設(shè)置你自己的系統(tǒng),當(dāng)你有一個(gè)微課或者講座,但是沒(méi)有時(shí)間去關(guān)注學(xué)生的機(jī)器狀況時(shí),這是一個(gè)很方便的方法。 把你的 notebook 保存起來(lái)(例如 dropbox),然后把鏈接放到 nbviewer[14]。無(wú)論你保存的主機(jī)是什么,nbviewer 都會(huì)渲染你的 notebook。 使用 File > Download as > PDF菜單選項(xiàng)來(lái)將你的 notebook 保存為一個(gè) PDF。如果你選擇這種路線,那我強(qiáng)烈建議你閱讀一下這篇 Julius Schulz 的優(yōu)秀文章:Making publication ready Python notebooks[15]。
Reference
Revolutions Blog: http://blog.revolutionanalytics.com/2016/01/pipelining-r-python.html
[2]fortran使用細(xì)節(jié): http://arogozhnikov.github.io/2015/11/29/using-fortran-from-python.html
[3]加速python細(xì)節(jié): http://arogozhnikov.github.io/2015/09/08/SpeedBenchmarks.html
[4]Jupyter-contrib extensions: https://github.com/ipython-contrib/jupyter_contrib_nbextensions
[5]RISE: https://github.com/damianavila/RISE
[6]ipyparallel (以前的 ipython 集群): https://github.com/ipython/ipyparallel
[7]rep: https://github.com/yandex/rep
[8]pyspark: http://www.cloudera.com/documentation/enterprise/5-5-x/topics/spark_ipython.html
[9]%%sql: https://github.com/jupyter-incubator/sparkmagic
[10]Google Colab: https://colab.research.google.com/notebooks/intro.ipynb
[11]git 分享的例子: https://github.com/dataquestio/solutions/blob/master/Mission202Solution.ipynb
[12]mybinder: http://mybinder.org/
[13]jupyterhub: https://github.com/jupyterhub/jupyterhub
[14]nbviewer: http://nbviewer.jupyter.org/
[15]Making publication ready Python notebooks: http://blog.juliusschulz.de/blog/ultimate-ipython-notebook
長(zhǎng)按掃碼添加Python小助手進(jìn)入?
←_←? PY交流群??→_→
▼點(diǎn)擊成為社區(qū)會(huì)員? ?喜歡就點(diǎn)個(gè)在看吧
