十大电子游戏平台网站,常平网站建设公司,免费建站网站大全,智慧旅游网站开发与设计与实现这系列用来介绍Python的标准库的支持Numpy部分。资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial#xff0c;页面有许多链接#xff0c;这里是直接翻译#xff0c;所以会无法链接。可以大致看完该博文#xff0c;再去看英文版。 1、先决条件 想要运行numpy#x…这系列用来介绍Python的标准库的支持Numpy部分。资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial页面有许多链接这里是直接翻译所以会无法链接。可以大致看完该博文再去看英文版。 1、先决条件 想要运行numpy首先最小安装的有Python、NumPy。a、ipython 是一个增强的交互式python shell它对于探索numpy的特性是非常方便的b、matplotlib可以让你进行plot 图表c、SciPy提供许多工作在numpy顶端的科学的例子。 2、基础知识 numpy的主要对象是同质多维数组。也就是在一个元素通常是数字表中元素的类型都是相同的。其中可以通过正整数的元组来对元素进行索引。在numpy中数组的维度被称为轴axes轴的数量称为秩rank。例如在3维空间中一个点[1,2,1]的坐标就是秩为1的数组因为它只有一个轴。这个轴的长度为3。下面的例子中数组的秩为2因为是2维的。第一个维度轴的大小是2第二个维度的大小是3 numpy的数组类被成为ndarray。别名为array。numpy.array与标准python库类array.array不一样标准库类中的那个只能处理一维数组并且功能更少。ndarray对象的重要的属性有 ndarray.ndim数组的轴维度的数量。在python中维度的数量通常被称为rank。 ndarray.shape数组的维度。为一个整数元组表示每个维度上的大小。对于一个n行m列的矩阵来说shape就是nm。shape元组的长度就是秩或者维度的数量ndim。 ndarray.size数组的元素的总个数。这等于shape元素的乘积。 ndarray.dtype用来描述数组中元素类型的对象。可以用标准python类型来创建或指定dtype或者在后面加上numpy的类型。numpy.int32numpy.int16numpy.float64等等 ndarray.itermsize数组的每个元素的字节大小。例如一个类型为float64的元素的数组itemsize 为864/8而一个complex32的数组itersize为432/8。该属性等价于ndarray.dtype.itemsize。 ndarray.data该缓冲区包含了数组的实际元素。通常情况下我们不需要使用这个属性因为我们会使用索引的方式来访问数组中的元素。 1)例子 2构建数组 有几种方法来构建数组。例如可以通过一个常规的python列表或者使用array函数的元组来构建。可以通过调用生成后数组的属性dtype来了解该数组的元素类型 经常犯得的错误调用array的时候传递了多个数值参数而不是使用单一的数字列表 array会将序列的序列转换成2维的数组序列的序列的序列会转换成3维的数组等等 数组的类型同样可以在创建的时侯显式指定 通常来说数组中元素的值在开始的时候是未知的不过数组的大小是已知的。所以numpy提供几个函数在创建数组的时候对元素的值进行占位。这样就可以避免后续需要对数组进行动态增长的操作数组的动态增长的代价较大。函数zeros生成一个全为0的数组函数ones生成一个全为1的数组函数empty生成一个初始化内容为随机并且依赖于内存状态的数组。默认情况下生成的数组的dtype是float64 为了生成数字序列。numpy提供一个类似于range的函数返回一个列表参数为起始结束步长 当传递的参数是浮点数时因为浮点数精度是有限的所以通常不会有稳定的元素个数的保证。所以使用函数linspace是一个更好的选择因为我们可以对该函数指定需要创建多少个元素参数为起始结束元素个数 see alsoarray, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, rand, randn,fromfunction, fromfile 3打印数组 当需要打印数组的时候numpy通过类似列表嵌套的形式来显示结果。其中的布局为a、在数组的最后维度轴上元素是从左到右打印的比如下面c的[8 9 10 11]b、其他维度上都是自顶向下打印的当维度较多时每个分片之间通过一个空行隔开一维数组按行打印二维按矩阵打印三维按矩阵的列表打印 below更多信息可以查看reshape。如果一个数组太大以至于无法打印numpy自动跳过中间部分只打印角部分 如果想关闭该功能并强制numpy打印整个数组可以改变打印的选项通过使用set_printoptions: 4基本操作 在数组上的算术操作符是逐元素的elementwise。得到的是一个重新创建的数组然后将结果写入新数组中 不同于其他的一些语言对矩阵的操作在numpy中乘积操作符×是逐元素进行的。矩阵的积可以通过使用dot 函数或者创建matrix对象 许多操作例如 和×支持原处修改现有的数组而不是生成一个新的数组 当涉及到不同类型的数组时是会将更通用或者精确度更高的那个类型upcasting作为新数组的类型 例如计算数组中所有元素的和的这类一元运算都是以ndarray类的方法来实现的 默认情况下这些操作的前提是数组中的元素是数字。通过指定axie参数可以指定对数组的哪个轴进行操作 5通用函数 numpy提供常见的数学函数例如sincos和exp。在numpy中这些被称为“通用函数 universal functionsufunc”。在numpy中这些函数是逐元素操作的输出的就是新的数组 see alsoall, alltrue, any, apply along axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, conjugate, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sometrue, sort, std,sum, trace, transpose, var, vdot, vectorize, where 6索引分片和迭代 一维数组可以被索引分片和迭代。就像列表和其它python序列一样 多维数组可以每个轴都有一个索引通过逗号隔开的元组来指定不同的轴上的索引操作 如果提供的索引比轴的个数要少缺省的索引表示的轴上会被认为是一个完整的分片 放在括号中的表达式b【i】表示一个i 后面跟着许多的值根据需要来表示其他的轴numpy同样可以使用三个点省略点(...)表示根据需要来代替未指定的轴的所有元素的索引。例如。如果x 是秩为5的数组即有5个轴那么 基于多维数组的迭代只是在第一个轴上进行操作也就是最上层的轴 然而如果想要在数组中每个元素上都有操作需要使用flat属性这是基于数组所有元素的一个迭代器 iterator see also[], ..., newaxis, ndenumerate, indices, index exp 3、形状操作 1改变数组的形状 当指定数组每个轴上元素个数的时候就形成了shape 数组的shape可以通过其他命令来改变 从ravel中生成的数组中元素的顺序是标准的“C-风格”也就是最右边的索引“改变的最快”。所以元素a【00】之后就是a【01】.如果数字是被reshaped到一些其他的shape该数组还是被认为“C-风格”。numpy通常生成的数组都是这种顺序存储的所以ravel不需要复制它的参数不过如果数组是通过另一个数组的分片或者不平常的选项生成的它也许需要被复制。函数ravel和reshape可以通过一个选项参数来指定是否使用FORTRAN-style的存储即最左边的索引变得最快。reshape函数返回的是修改过的shape的参数因而 resize方法会修改数组本身 如果在reshape操作中某个维度的值为-1那么就会被自动计算 see alsoshape example, reshape example, resize example, ravel example 2将不同的数组堆叠在一起 可以在不同的轴上将几个数组堆叠起来 函数column_stack 可以将1维数组按列的方式堆叠成2维的数组下图第5个命令。注意下面的vstack函数 另一方面函数 row_stack按照行的方式将1维数组堆叠成2维数组。对于超过2维的数组hstack会沿着第二轴进行堆叠vstack会沿着第一轴堆叠 concatenate允许一个可选的参数指定在第几个轴上进行concatenation操作。 Note在复数情况中r_[] 和c_[] 可以如下来生成数组。它们允许范围标识“”的使用 当将数组作为参数使用时r_[] 和c_[] 的操作类似于vstack和 hstack在默认参数下的结果同时也可以通过一个可选参数来指定连接concatenate哪个轴。 see alsohstack example, vstack exammple, column_stack example, row_stack example,concatenate example, c_ example, r_ example。 3将一个数组划分成几个小的数组 使用hsplit函数可以沿着水平轴划分数组。可以进行等同划分或者指定列划分 vsplit沿着竖直轴进行划分array split 允许指定沿着哪个轴划分。 4、复制和视图 当对数组进行操作的时候它们的数据有时候会被复制到一个新的数组中有时候又不会。这通常是一个对于初学者来说很困惑的地方。有三种情况 1完全不复制 简单的赋值不会复制数组对象或者它们的数值 python将可变的对象作为引用所以函数调用是没有复制的 2浅层复制 不同的数组对象可以共享相同的数据。view方法生成一个新的数组对象其中的数据看上去是一样的 3深层复制 copy方法会生成一个数组和它的数据的复制版本 4函数和方法概述 这里列出numpy的函数列表和方法。名字是与Numpy Example List相关联的 创建数组arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r , zeros, zeros_like 转换astype, atleast 1d, atleast 2d, atleast 3d, mat。 操作manipulationsarray split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis,ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack 询问all, any, nonzero, where。 排序argmax, argmin, argsort, max, min, ptp, searchsorted, sort。 操作operationschoose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum 基本的统计cov, mean, std, var。 基本的线性代数cross, dot, outer, svd, vdot。 5、更少的基础 1广播broadcasting的规则 广播允许通用函数中的矩阵的shape不完全一致a、广播的第一个规则就是如果所有的输入数组没有相同数量的维度“1”会被重复的预考虑到更小的数组的形状上直到所有的数组有着相同的维度数量b、广播的第二个规则就是确保有着size为1的数组可以沿着特定的维度进行操作就好像沿着这个维度上数组有着最大的形状shape。数组元素的值被假设成沿着这个维度有着一样的“广播”数组个人这里和matlab中bsxfun的行为类似。在广播规则的应用之后所有的数组的size必须可以匹配。更多的可以查看 this documentation。 6、索引技巧 numpy提供比常规python序列更多的索引方法。除了整合和分片数组可以被整数数组和布尔数组索引。 1索引数组的索引 当索引数组是多维度的时候索引数组中的每个值指向的是原来数组中的第一维也就是顶层。下面例子就是image2*4索引的是palette5*3的矩阵中第一维上不同的子数组结果为2*4*3的矩阵 下面就是给出多个索引数组这时候每个索引数组必须shape一致这时候可以看成是坐标点的形式 当然我们可以将i 和 j 放入一个序列中一个列表然后对该列表进行索引 然而我们没法将 i 和 j 放入数组中因为这个数组会被解释成 a 的第一维索引 下面是另一个使用索引数组的例子 可以使用索引数组来对指定元素进行更新 然而当索引的列表里面有重复的时候同一个元素会被更新好几次并保留最后的更新 当想要使用python的来构建的时候它的结果也许不像你期望的那样没有重复更新 即使0在索引列表中发生了两次。第0个元素只更新一次。这是因为python要求“a1”等效于“a a1”. 2布尔数组的索引 当我们通过索引整数数组来对数组进行索引我们提供了索引的列表去进行挑选显式的选择数组中的项是否是我们想要的。对布尔索引的最自然的方式就是使用与原始数组一样shape的布尔数组 这个特性在赋值的时候很有用 可以通过查看Mandelbrot set example来了解如何使用布尔索引来生成 Mandelbrot set的图像的。 第二种布尔索引的方式更类似于整数索引对于数组的每一维来说我们给它一个1维布尔数组来选择我们想要的分片 注意到1维布尔数组的长度必须与你想要分片的维度或者轴的长度一致。在之前的例子中b1 是一个 1-rank 的数组长度为3在a 中行的数量和b2 长度为4是匹配a 的第二个秩列的索引的。 3ix_()函数 ix_function可以组合不同维度的向量然后按照参数的个数来决定进行多少维度的升级下面是三个参数所以ax有三维如果是四个参数那么ax就是四维了。例如按照式子ab*c来计算向量abc 的所有元素的组合得到的是一个4*3*5的矩阵 或者定义函数 然后像下面这样使用 与ufunc.reducenumpy中的方法相比较该版本的优势在于它会使用广播规则 Broadcasting Rules来避免生成参数数组等。 4字符串的索引 见RecordArrays. 7、线性代数 基本的线性代数都包含在这里。 1单一数组操作 numpy的文件夹内的linalg.py的代码可以更细致的介绍原理 2矩阵类 对矩阵类的简短介绍 3索引矩阵和2D数组的比较 注意到在NumPy 数组和矩阵之间不同的。NumPy 提供了两种基本的对象一个N维的数组对象和一个通用的函数对象。其他对象都是建立在这些上面的。特别的矩阵是2维的数组对象继承自NumPy 数组对象。对于数组和矩阵来说索引必须包含合适的一个或多个的组合整数标量、省略号、整数或布尔值列表、整数或布尔值元组、整数或布尔值的1维数组。一个矩阵可以用来作为矩阵的索引但是通常的数组、列表或其他的形式需要在给定的任务下完成。 在python中索引是从0开始的。传统的我们将一个2D数组或矩阵表示成使用行和列的常规数组沿着轴0移动就是沿着行移动沿着轴1移动就是沿着列移动。 如下例子 现在让我们考虑一些简单的分片。基本的分片使用分片对象或者整数。例如A[:]和M[:]在python中很相似然而必须注意到分片Numpy数组不是对数据进行拷贝分片提供对同一个数据的一个新的视图 现在对于python索引中的一些不同你也许会使用逗号隔开的索引对多个轴进行索引 注意到上面两个结果的不同。使用一个2D数组的复制会生成一个1维的数组而对于一个矩阵来说会生成一个2维的数组。一个矩阵的分片总是会生成一个矩阵。例如一个分片M[2,:]生成一个shape14的矩阵。相反地一个数组的分片总是生成一个最低可能维度的数组。例如如果C是一个3维的数组C[...,1]生成一个2D数组同时C[1,...,1]会生成一个1维数组。我们显示的结果就能看出在数组分片的结果和对应的矩阵分片的结果是不一样的。 这里假设我们想要数组的第一和第三列。一种分片的方法是使用列表 较为老练的方法是使用take方法 如果我们想要跳过第一行我们可以 或者简单的使用A[1:,[1,3]]。然而另一个方法是使用交叉结果 为了读者的方便再次打印数组 现在让我们做一些更复杂的事情。假设我们想要保留所有的那些第一行大于1的列。一种方法是生成一个布尔索引 正如我们想要的但是索引矩阵不是很方便 问题就是分片矩阵的块会生成一个矩阵。但是矩阵有一个方便的“A”属性它的值就是数组的表征所以我们可以如下 如果想要有条件的在两个方向上分片矩阵。如下 需要使用交叉积cross product“ix_” 8、技巧和提示 这里给出一些短的但是有用的提示。 1“自动”reshaping 使用-1可以让机器自己计算该维度上是多少 2向量堆叠 如何从一个相同size的行向量列表中构建一个2D数组在matlab中这是相当容易的如果 x 和 y 是两个有着相同大小的向量你只需要 m [x:y]就行。在Numpy中这是通过函数 column_stack, dstack, hstack 和 vstack取决于哪个维度上的需要被堆叠。例如 在超过2维情况下这些函数背后的逻辑是相当奇怪的。可以详细的观看 NumPy for Matlab Users 。 3直方图 应用在一个数组上的numpy的histogram函数会返回一个向量对数组的直方图和bins的向量。注意matplotlib同样有个函数来建立直方图叫做hist和matlab中一样这不同于numpy中的这个函数。主要的区别在于pylab.hist会自动画直方图而numpy.histogram只是生成数据 9、参考资料 The Python tutorial. The Numpy Example List. The nonexistent NumPy Tutorial at scipy.org, where we can find the old Numeric documentation. The Guide to NumPy book. The SciPy Tutorial and a SciPy course online NumPy for Matlab Users. A matlab, R, IDL, NumPy/SciPy dictionary. 转载于:https://www.cnblogs.com/shouhuxianjian/p/4529164.html