原文:NumPy Cookbook - Second Edition
协议:CC BY-NC-SA 4.0
译者:飞龙
在本章中,我们将介绍以下秘籍:
IPython,可从 ipython.org 获得,是一个免费的开源项目 ,可用于 Linux,Unix,MacOSX, 和 Windows。 IPython 作者仅要求您在使用 IPython 的任何科学著作中引用 IPython。 IPython 提供了用于交互式计算的架构。 该项目最值得注意的部分是 IPython shell。 IPython 提供了以下组件,其中包括:
IPython 与 Python 2.5、2.6、2.7、3.1、3.2、3.3 和 3.4 版本兼容。 兼容性取决于 IPython 版本。 例如,IPython 2.3.0 需要 Python 2.7 或 3.3+。
您可以在这个页面上在云中尝试 IPython 而不将其安装在系统上。 与本地安装的软件相比,会有一些延迟,因此这不如真实的软件好。 但是, IPython 交互式外壳程序中可用的大多数功能似乎都可用。 PythonAnywhere 也有一个 Vi(m) 编辑器,如果您喜欢 vi 的话,那显然很棒。 您可以从 IPython 会话中保存和编辑文件。
可以通过多种方式安装 IPython ,具体取决于您的操作系统。 对于基于终端的外壳,需要依赖readline
。 网络笔记本需要tornado
和zmq
。
除了安装 IPython 外,我们还将安装setuptools
,它为您提供easy_install
命令。 easy_install
命令是 Python 的流行package
管理器。 一旦拥有easy_install
即可安装pip
。 pip
命令类似于easy_install
,并添加了诸如卸载之类的选项。
本节介绍如何在 Windows,MacOSX 和 Linux 上安装 IPython。 它还描述了如何使用easy_install
和pip
或从源代码安装 IPython 及其依赖项:
在 Windows 上安装 IPython 和 Setuptools:IPython 网站上提供了适用于 Python2 或 Python3 的二进制 Windows 安装程序。 另见这里。
使用安装程序安装 Setuptools。 然后安装pip
,如下所示:
cd C:\Python27\scripts
python .\easy_install-27-script.py pip
在 MacOSX 上安装 IPython:如果需要 ,请安装 Apple Developer Tools(Xcode)。 可以在这个页面上找到 Xcode。 请遵循easy_install/pip
说明或本节后面提供的从源安装的说明。
在 Linux 上安装 IPython:由于 Linux 发行版太多,因此本节将不详尽:
在 Debian 上,键入以下命令:
$ su – aptitude install ipython python-setuptools
在 Fedora 上,魔术命令如下:
$ su – yum install ipython python-setuptools-devel
以下命令将在 Gentoo 上安装 IPython:
$ su – emerge ipython
对于 Ubuntu,安装命令如下:
$ sudo apt-get install ipython python-setuptools
使用easy_install
或pip
安装 IPython:使用以下命令,通过easy_install
安装 IPython 和本章中的秘籍所需的所有依赖项:
$ sudo easy_install ipython pyzmq tornado readline
或者,您可以通过在终端中键入以下命令,首先使用easy_install
安装pip
:
$ sudo easy_install pip
之后,使用pip
安装 IPython:
$ sudo pip install ipython pyzmq tornado readline
从源代码安装:如果您想使用最新的开发版本,则从源代码安装适合您:
从这个页面下载最新的源存档。
从存档中解压缩源代码:
$ tar xzf ipython-<version>.tar.gz
相反,如果您已安装 Git,则可以克隆 Git 存储库:
$ git clone https://github.com/ipython/ipython.git
转到下载源中的根目录:
$ cd ipython
运行安装脚本。 这可能需要您使用sudo
运行命令,如下所示:
$ sudo python setup.py install
我们使用几种方法安装了 IPython。 这些方法大多数都安装最新的稳定版本,但从源代码安装时除外,这将安装开发版本。
科学家和工程师习惯进行实验。 IPython 是科学家根据实验而创建的。 IPython 提供的交互式环境被许多人视为对 MATLAB,Mathematica,Maple 和 R 的直接回答。
以下是 IPython Shell 的功能列表:
%run
调用外部 Python 脚本的功能pylab
开关本节描述了如何使用 IPython Shell:
pylab
:pylab
开关会自动导入所有 SciPy,NumPy 和 matplotlib 包。 没有此开关,我们将不得不自行导入这些包。
我们需要做的就是在命令行中输入以下指令:
$ ipython --pylab
Type "copyright", "credits" or "license" for more information.
IPython 2.4.1 -- 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.
Welcome to pylab, a matplotlib-based Python environment [backend: MacOSX].
For more information, type 'help(pylab)'.
In [1]: quit()
quit() or Ctrl + D quits the IPython shell.
保存会话:我们可能希望能够返回到我们的实验。 在 IPython 中,很容易保存会话以供以后使用。 这是通过以下命令完成的:
In [1]: %logstart
Activating auto-logging. Current session state plus future input saved.
Filename : ipython_log.py
Mode : rotate
Output logging : False
Raw input log : False
Timestamping : False
State : active
可以使用以下命令关闭日志记录:
In [9]: %logoff
Switching logging OFF
执行系统 Shell 命令:您可以在默认的 IPython 配置文件中通过在命令前面加上!
符号来执行系统外壳命令。 例如,以下输入将获取当前日期:
In [1]: !date
实际上,任何以!
为前缀的行都将发送到系统外壳。 我们还可以存储命令输出,如下所示:
In [2]: thedate = !date
In [3]: thedate
显示历史记录:我们可以使用%hist
命令显示命令的历史记录,如下所示:
In [1]: a = 2 + 2
In [2]: a
Out[2]: 4
In [3]: %hist
a = 2 + 2
a
%hist
这是命令行界面(CLI)环境中的常见功能。 我们还可以使用-g
开关查询历史记录:
In [5]: %hist -g a = 2
1: a = 2 + 2
我们看到了许多所谓的魔术功能在起作用。 这些功能以%
字符开头。 如果单独在行中使用魔术函数,则%
前缀是可选的。
我们可以使用help
命令打开有关 NumPy 函数的文档。 不必知道函数的名称。 我们可以输入几个字符,然后让制表符完成工作。 例如,让我们浏览arange()
函数的可用信息。
我们可以通过以下两种方式之一浏览可用信息:
带问号的查询:另一个选择是在函数名称后添加问号。 然后,您当然需要知道函数名称,但是不必键入help
命令:
In [3]: arange?
制表符的完成取决于readline
,因此您需要确保已安装它。 问号为您提供docstrings
中的信息。
matplotlib(按惯例所有小写字母)是一个非常有用的 Python 绘图库,对于以下秘籍以及以后的内容,我们将需要它 。 它取决于 NumPy,但很可能已经安装了 NumPy。
我们将看到如何在 Windows,Linux 和 MacOSX 上安装 matplotlib,以及如何从源代码安装它:
在 Windows 上安装 matplotlib:您可以使用 Enthought 发行版(也称为 Canopy)。
可能需要将msvcp71.dll
文件放在您的C:\Windows\system32
目录中。 您可以从这里获取。
在 Linux 上安装 matplotlib:让我们看看如何在 Linux 的各种发行版中安装 matplotlib:
这是 Debian 和 Ubuntu 上的安装命令:
$ sudo apt-get install python-matplotlib
在 Fedora/Redhat 上的安装命令如下:
$ su - yum install python-matplotlib
从源代码安装:您可以下载 Sourceforge 的tar.gz
版本或从 Git 存储库下载最新的源代码:
$ git clone git://github.com/matplotlib/matplotlib.git
下载后,请使用以下命令照常构建和安装 matplotlib:
$ cd matplotlib
$ sudo python setup.py install
在 MacOSX 上安装 matplotlib:从这里获取最新的 DMG 文件 。 您还可以使用 Mac Ports,Fink 或 Homebrew 包管理器。
IPython 具有一项令人兴奋的功能-网络笔记本。 所谓的笔记本服务器可以通过 Web 服务笔记本电脑。 现在,我们可以启动笔记本服务器并获得基于 Web 的 IPython 环境。 该环境具有常规 IPython 环境具有的大多数功能。 IPython 笔记本的功能包括:
在开始之前,我们应确保已安装所有必需的软件。 依赖于tornado
和zmq
。 有关更多信息,请参见本章中的“安装 IPython”秘籍。
运行笔记本:我们可以使用以下命令启动笔记本:
$ ipython notebook
[NotebookApp] Using existing profile dir: u'/Users/ivanidris/.ipython/profile_default'
[NotebookApp] The IPython Notebook is running at: http://127.0.0.1:8888
[NotebookApp] Use Control-C to stop this server and shut down all kernels.
如您所见,我们正在使用默认配置文件。 服务器在本地计算机上的端口 8888 上启动。稍后,您将在本章中学习如何配置这些设置。 笔记本在默认浏览器中打开; 这也是可配置的(请参见以下屏幕截图):
IPython 在启动笔记本的目录中列出了所有笔记本。 在本示例中,未找到笔记本。 可以通过按Ctrl + C
停止服务器。
以pylab
模式运行笔记本:使用以下命令以pylab
模式运行网络笔记本:
$ ipython notebook --pylab
这将加载SciPy
,NumPy
和matplotlib
模块。
运行带有嵌入式图形的笔记本:我们可以使用以下命令,通过inline
指令显示嵌入式 matplotlib 图:
$ ipython notebook --pylab inline
以下步骤演示了 IPython 笔记本的功能:
内联选项使可以显示内联 matplotlib 图。 与pylab
模式结合使用时,无需导入 NumPy,SciPy 和 matplotlib 包。
sinc()
函数的文档plot()
函数的文档有时,您想与朋友或同事交换笔记本。 网络笔记本提供了几种导出数据的方法。
可以使用以下选项导出 Web 笔记本:
打印选项:打印按钮实际上并未打印笔记本,但允许您将笔记本导出为 PDF 或 HTML 文档。
下载笔记本:使用“下载”按钮将笔记本下载到您选择的位置。 我们可以指定将笔记本下载为.py
文件(只是普通的 Python 程序),还是下载为 JSON 格式的.ipynb
文件。 导出后,我们在前一个秘籍中创建的笔记本如下所示:
{
"metadata": {
"name": "Untitled1"
},
"nbformat": 2,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(sinc(a))"
],
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 3,
"text": [
"[]"
]
},
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD9CAYAAABZVQdHAAAABHNCSVQICAgIf...
mgkAAAAASUVORK5CYII=\n"
}
],
"prompt_number": 3
}
]
}
]
}
为简洁起见,一些文本已被省略。 该文件不适合编辑甚至阅读,但如果忽略图像表示部分,则可读性很强。 有关 JSON 的更多信息,请参见这里。
保存笔记本:使用保存按钮保存笔记本。 这会自动以本地 JSON 格式.ipynb
导出笔记本。 该文件将存储在最初启动 IPython 的目录中。
可以将 Python 脚本作为 Web 笔记本导入。 显然,我们也可以导入以前导出的笔记本。
此秘籍向您展示如何将 Python 脚本作为 Web 笔记本导入。
使用以下命令加载 Python 脚本:
% load vectorsum.py
以下屏幕截图显示了从“NumPy 入门指南”加载vectorsum.py
后进入笔记本页面的示例:
公共笔记本服务器需要安全。 您应该设置一个密码并使用 SSL 证书来连接它。 我们需要证书来通过 HTTPS 提供安全的通信(有关更多信息,请参见这里)。 HTTPS 在互联网上广泛使用的标准 HTTP 协议之上添加了一个安全层。 HTTPS 还对从客户端发送到服务器并返回的数据进行加密。证书颁发机构通常是为网站颁发证书的商业组织。 Web 浏览器具有证书颁发机构的知识,并且可以识别证书。 网站管理员需要创建证书并由证书颁发机构签名。
以下步骤描述了如何配置安全的笔记本服务器:
我们可以从 IPython 生成密码。 启动一个新的 IPython 会话并输入以下命令:
In [1]: from IPython.lib import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:0e422dfccef2:84cfbcbb3ef95872fb8e23be3999c123f862d856'
在第二个输入行,将提示您输入密码。 您需要记住该密码。 生成一个长字符串。 复制此字符串,因为稍后将需要它。
要创建 SSL 证书,您需要在路径中使用openssl
命令。
设置openssl
命令不是火箭科学,但这可能很棘手。 不幸的是,这超出了本书的范围。 好的一面是,在线上有很多教程可以帮助您进一步发展。
执行以下命令,以mycert.pem
为名称创建证书:
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
Generating a 1024 bit RSA private key
......++++++
........................++++++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
openssl
工具提示您填写一些字段。 有关更多信息,请查看相关的手册页(手册页的缩写),如下所示:
$ man openssl
使用以下命令为服务器创建特殊的配置文件:
$ ipython profile create nbserver
编辑配置文件。 在此示例中,可以在~/.ipython/profile_nbserver/ipython_notebook_config.py
中找到。
配置文件很大,因此我们将省略其中的大多数行。 我们至少需要更改的行如下:
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate'
c.NotebookApp.password = u'sha1:b...your password'
c.NotebookApp.port = 9999
请注意,我们指向的是我们创建的 SSL 证书。 我们设置了密码,并将端口更改为 9999。
使用以下命令,启动服务器以检查更改是否有效:
$ ipython notebook --profile=nbserver
[NotebookApp] Using existing profile dir: u'/Users/ivanidris/.ipython/profile_nbserver'
[NotebookApp] The IPython Notebook is running at: https://127.0.0.1:9999
[NotebookApp] Use Control-C to stop this server and shut down all kernels.
服务器在端口 9999 上运行,您需要通过 HTTPS 连接到它。 如果一切顺利,您应该会看到一个登录页面。 另外,您可能需要在浏览器中接受安全例外。
我们为公共服务器创建了一个特殊的配置文件。 已经有一些样本概要文件,例如默认概要文件。 创建配置文件后,将使用配置文件将profile_
文件夹添加到.ipython
目录。 然后可以使用--profile=
命令行选项加载配置文件 。 我们可以使用以下命令列出配置文件:
$ ipython profile list
Available profiles in IPython:
cluster
math
pysh
python3
The first request for a bundled profile will copy it
into your IPython directory (/Users/ivanidris/.ipython),
where you can customize it.
Available profiles in /Users/ivanidris/.ipython:
default
nbserver
sh
passwd()
函数的文档IPython 有一个示例 SymPy 配置文件。 SymPy 是一个 Python 符号数学库。 我们可以简化代数表达式或区分函数,类似于 Mathematica 和 Maple。 显然,SymPy 是一款有趣的软件,但对于我们穿越 NumPy 的过程而言并不是必需的。 将此视为可选或额外的秘籍。 就像甜点一样,可以随意跳过它,尽管您可能会错过本章中最甜的部分。
使用easy_install
或pip
安装 SymPy:
$ sudo easy_install sympy
$ sudo pip install sympy
以下步骤将帮助您探索 SymPy 配置文件:
查看配置文件,该文件位于~/.ipython/profile_sympy/ipython_config.py
。内容如下:
c = get_config()
app = c.InteractiveShellApp
# This can be used at any point in a config file to load a sub config
# and merge it into the current one.
load_subconfig('ipython_config.py', profile='default')
lines = """
from __future__ import division
from sympy import *
x, y, z, t = symbols('x y z t')
k, m, n = symbols('k m n', integer=True)
f, g, h = symbols('f g h', cls=Function)
"""
# You have to make sure that attributes that are containers already
# exist before using them. Simple assigning a new list will override
# all previous values.
if hasattr(app, 'exec_lines'):
app.exec_lines.append(lines)
else:
app.exec_lines = [lines]
# Load the sympy_printing extension to enable nice printing of sympy expr's.
if hasattr(app, 'extensions'):
app.extensions.append('sympyprinting')
else:
app.extensions = ['sympyprinting']
此代码完成以下任务:
使用以下命令以 SymPy 配置文件启动 IPython:
$ ipython --profile=sympy