NumPy CookBook:第一章,使用IPython

IPython官网:http://ipython.org/ IPython 的两个主要组件 基于终端模式和基于Qt的交互式 Python shell 基于web,支持绘图和多媒体功能的notebook,基于Tornado web服务器 和 pyzmq(一个 ZeroMQ 消息库的 Python 封装) IPython 的交互式 shell IPython shell特性 代码补全: 按Tab键即可 历史记录机制 1.shell下输入 %hist, %history 可以调出历史命令记录,使用 -g选项可以搜索历史记录,如: $hist -g a = 2 2.或者用上下方向键逐条调出历史命令记录 3.可以录制操作记录供未来使用, %logstart logfilename 开始录制, %logstop 停止录制 嵌入式编辑 使用%run 调用外部python脚本 访问操作系统shell命令:用!后跟操作系统命令,如!date,并且可以将系统返回值作为变量值使用 pylab开关:用ipython –pylab 启动IPython时, 会同时导入 NumPy, SciPy, Matplotlib软件包, 不需要另外导入. 但不建议用这种方式, 而是建议进入ipython后运行 %pylab 命令. 访问Python的调试器和性能分析器 调用帮助 可以使用help函数, help(function_name). 调用该函数时可以用代码补全, 不停按TAB键跳到自己需要查找帮助的函数名 可以直接在函数名后面加?,如: arange?

NumPy中的广播(broadcasting)

broadcasting 是Numpy中比较高级的概念。该名词broadcasting描述了Numpy在进行算数计算过程中如何处理不同形状的数组。受限于某些约束,较小的数组会通过“广播broadcast”来跨越更大的数组以便他们在形状上能够兼容。广播提供了一种将数组操作向量化的方法,以便循环操作在C语言代码中执行而不是在Python语言代码中执行。广播操作不需要拷贝数据,这样通常会让算法实现更高效。还有一些情形下广播是一个坏主意,因为它导致低效的内存使用从而减慢了计算。本文用很多示例,包括简单的和复杂的示例,对广播进行了一般性的介绍,同时提供了一些何时使用,何时不适用广播的提示。 NumPy运算操作通常是逐个元素进行的,需要两个数组具有完全相同的形状: 示例 1 >>> import numpy as np >>> a = np.array([1.0, 2.0, 3.0]) >>> b = np.array([2.0, 2.0, 2.0]) >>> a * b array([ 2., 4., 6.]) 当数组的形状满足某些限制时,NumPy 的广播规则放宽了这个约束。 最简单的广播示例是,参与运算的两个操作数一个是数组,一个是标量值: 示例 2 >>> a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([ 2., 4., 6.]) 结果等同于前面的例子,前面的例子中b是一个数组而不是一个标量。 我们可以视为将算术运算中的标量b拉伸成与数组a形状相同的数组。 b中的新元素如图1所示,只是原始标量的副本。 拉伸类比只是概念性的。 NumPy足够聪明,只会使用原始标量值而不会实际复制数据,从而尽可能的提升使广播操作的内存使用效率和计算效率。 因为示例2在做乘法计算时移动了更少的内存(b是标量,而不是数组),所以Windows 2000 上使用标准的 NumPy计算 100万个数据项的数组时,大概比示例1 快10%. 图1:在最简单的广播示例中,标量b被拉伸成和数组a具有相同形状的数组,因此两个数组的形状和两两逐个数据项相乘的乘法要求就兼容了. 决定两个数组的shape是否广播兼容的规则可以用一个句子表达: 广播规则 为了能够广播,参与运算的两个数组的最后一个轴的大小要么必须相同,要么其中一个必须是数字1. 如果不满足此条件,则会抛出 ValueError:frames are not aligned 异常,指示参与运算的数组的形状不兼容。 由广播操作创建的结果数组的大小是沿着参与运算的数组的每个维度的最大值决定的。 请注意,该规则并没有说明参与运算的两个数组的维度数量需要相同。 所以,例如,如果你有一个256x256x3 的关于RGB值的数组,并且你想要通过不同的值来缩放图像中的每个颜色,你可以将图像乘以一个有三个值的一维数组。 延展这些数组的最后一个轴的大小后,根据广播规则它们是兼容的:

NumPy快速入门教程

开始之前 在阅读本教程之前,您应该了解一些Python。 如果你想刷新你的记忆,看看Python教程。 如果您希望在本教程中使用示例,还必须在计算机上安装一些软件。 有关说明,请参阅 http://scipy.org/install.html。 基本概念 NumPy的主要对象是数据类型相同的元素构成的多维数组。 它是一个由元素(通常是数字)构成的表,全部是相同的类型,由正整数元组索引。在 NumPy中,维(dimensions)被称为轴(axes), 轴的数量被称作秩(rank)。 例如,3D空间中的一个点的坐标[1,2,1]是一个秩为1的数组,因为它具有一个轴(axis)。 该轴的长度为3.在下面的示例中,该数组的秩为2(它是2维)。 第一维(轴)的长度为2,第二维的长度为3。 [[ 1., 0., 0.], [ 0., 1., 2.]] NumPy的数组类叫做ndarray, 它的别名为array。 请注意,numpy.array与标准Python库类array.array不同,后者只处理一维数组并提供较少的功能。 一个ndarray对象比较重要的属性有: ndarray.ndim 数组的轴数(维数)。 在Python世界中,维度的数量被称为秩(rank)。 ndarray.shape 数组的形状。该属性值是一个整数元组,标明了每个维度中数组的大小。 对于n行和m列的矩阵,形状将为(n,m)。 因此,形状元组的长度len(shape)就是该数组的秩(rank),或者说是该数组的维度,即:ndarray.ndim。 ndarray.size 数组的元素总数, 等于ndarray.shape的各个元素的乘积。 ndarray.dtype 描述数组中元素数据类型的对象。 可以使用标准Python类型创建或指定dtype。 另外NumPy提供了自己的类型。 numpy.int32,numpy.int16和numpy.float64是一些例子。 ndarray.itemsize 数组的每个元素的大小(以字节为单位)。 例如,float64类型的元素数组具有itemsize 8(= 64/8),而complex32类型的元素大小为4(= 32/8)。 该属性等同于ndarray.dtype.itemsize。 ndarray.data 该缓冲区包含了数组的实际元素。 通常,我们不需要使用此属性,因为我们会使用索引功能访问数组中的元素。 NumPy中的维度(dimension)的概念和我们日常立体几何中的概念容易混淆.我们理解的三维空间的点会用类似[2,3,4]这样一个包含3个标量的一维数组表示, 如果是表示平面中的点,会用一个包含2个标量的数组,类似[2,3]表示,超过3维就很难用我们可以感知的立体空间理解了, 只能用属性理解.比如一个人的属性:身高,体重,年龄,性别,籍贯等等,就可以用一个包含多个属性的一维数组表示.NumPy中的维度的概念和集合中维度的概念没有任何关系,也不能类比.在维度这个概念上, 几何中的2维,3维,N维到了NumPy这就是一个标量,或者说一个元素的表示. NumPy中的维度是封装的意思,即:按顺序排列的一个数据序列最后被封装了几层.封装了一层,就是一个类似Python中的list, 封装了2层就是一个矩阵,等等.封装的层级越多, 索引的时候越复杂,对应的rank越高. 理解了维度的概念后, 我们可以用封装的概念理解shape的概念.shape是一个元组, 对应的数据为逐层封装时,由外到里,每层的元素的个数,比如shape为(2,3,4),这是一个长度为3,即rank为3的数组,用维度来理解即:有3层封装,最外层有两个元素,往里,每层有3个元素,最里面,每层有4个元素.所以,np.zeros((2,3,4))对应的数组为: array([[[ 0., 0., 0., 0.], [ 0., 0., 0.

NumPy是什么

如果使用 Python语言进行科学计算, NumPy是最基础的库. 该Python库提供了一个多维数组对象及其派生对象,以及用来快速操作这些对象的各类方法,包括数学计算,逻辑计算,数据形态(shape)操作,排序,选择,I/O,离散傅里叶变换,基础线性代数,基础统计运算,随机模拟,等等. ndarray对象是NumPy包的核心, ndarray 是 n-dimensional arrays 的缩写.该对象封装了相同类型的数据构成的n维数组和很多为了提升性能而预编译的操作. NumPy 的数组和标准的 Python序列有几个重要的不同之处: * NumPy 数组在创建时大小就是固定的,而 Python列表的大小是可以动态变化的. 变更 ndarray 的大小会创建一个新的数组同时删掉原来的数组. * NumPy数组的元素要求数据类型是相同的,在内存中的大小也一样.例外情况:由对象构成的数组的元素的大小可以不同,这种情况下 dtype=object. 比如:a = np.array([[‘hello’],[1,2,3],[1.0,2.0],{1:2,3:4}]) 生成的数组: array([[‘hello’], [1, 2, 3], [1.0, 2.0], {1: 2, 3: 4}], dtype=object) * NumPy数组大大降低了对大数据量进行高级数据和其他类型操作的难度. 通常,这样的操作可以比使用Python的内置序列更有效,代码更少。 * 越来越多的基于Python语言的科学和数学软件包在使用NumPy数组.尽管这些软件包通常支持Python语言中的序列输入,通常在处理这些数据前依然会将这些输入转换为NumPy数组,并且输出通常为NumPy数组.换句话说,为了有效地使用当今科学/数学中基于Python的大多数软件,只知道如何使用Python的内置序列类型是不够的,还需要知道如何使用NumPy数组。 在科学计算中, 序列的大小和计算速度是至关重要的.举一个简单的例子,考虑将1维序列中的每个元素与相同长度的另一个序列中的相应元素相乘的情况。 如果数据存储在两个Python列表a和b中,我们可以遍历每个元素: c = [] for i in range(len(a)): c.append(a[i]*b[i]) 该代码会产生正确的答案,但是如果a和b每个包含数百万个数字,我们将为Python中循环的低效率付出代价。我们可以用C语言实现同样的功能更快地完成相同的任务(为了清晰起见,我们省略了变量声明和初始化,内存分配等相关的代码): for (i = 0; i < rows; i++): { c[i] = a[i]*b[i]; } 这节省了解释Python代码和操纵Python对象所需的所有开销,但是牺牲掉了用Python语言编码所能带来的可读性,可维护性等好处。 此外,所需的编码工作会随着数据的维数[维数]而增加。 例如,在二维数组的情况下,C代码(和前一段代码做同样的简化处理):

NumPy CookBook:第二章,高级索引和数组概念

安装PIL 据 PIL 官网, 目前暂时还没支持Python3, windows 下可以用 conda install pillow 命令安装PIL的替代品 pillow. 示例:调整图像的大小 # -*- coding: utf-8 -*- # 该脚本用来调整SciPy库中图像face的大小 import scipy.misc import matplotlib.pyplot import numpy.testing # 图像face 是一张SciPy库中内置的浣熊的脸 # 加载图像到一个数组中 raccoon_face = scipy.misc.face() # 图像的规格: 1024 * 768 # 检查数组的形状, 这是一个可选的完整性检查 numpy.testing.assert_equal((768, 1024, 3), raccoon_face.shape) # 获取调整系数 yfactor = 2 xfactor = 3 # 调整数组的大小,repreat 函数用来对数组进行repeat操作 resized = raccoon_face.repeat(yfactor, axis=0).repeat(xfactor, axis=1) # 检查大小调整后的数组的形状, 如果调整系数不是整数, 可能会导致检测结果不相等而抛出异常 numpy.testing.assert_equal((yfactor * 768, xfactor * 1024, 3), resized.