Python3.1-Numpy模块之入门教程
Posted 仙守
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3.1-Numpy模块之入门教程相关的知识,希望对你有一定的参考价值。
这系列用来介绍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就是(n,m)。shape元组的长度就是秩(或者维度的数量)ndim。
ndarray.size:数组的元素的总个数。这等于shape元素的乘积。
ndarray.dtype:用来描述数组中元素类型的对象。可以用标准python类型来创建或指定dtype;或者在后面,加上numpy的类型。numpy.int32;numpy.int16;numpy.float64等等
ndarray.itermsize:数组的每个元素的字节大小。例如,一个类型为float64的元素的数组itemsize 为8(=64/8),而一个complex32的数组itersize为4(=32/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 also:array, 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提供常见的数学函数,例如sin,cos,和exp。在numpy中,这些被称为“通用函数 universal functions(ufunc)”。在numpy中,这些函数是逐元素操作的,输出的就是新的数组:
see also:all, 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【0,0】之后就是a【0,1】.如果数字是被reshaped到一些其他的shape,该数组还是被认为“C-风格”。numpy通常生成的数组都是这种顺序存储的,所以ravel()不需要复制它的参数,不过如果数组是通过另一个数组的分片或者不平常的选项生成的,它也许需要被复制。函数ravel()和reshape()可以通过一个选项参数来指定是否使用FORTRAN-style的存储,即最左边的索引变得最快。reshape函数返回的是修改过的shape的参数,因而 resize方法会修改数组本身:
,
如果在reshape操作中,某个维度的值为-1,那么就会被自动计算
see also:shape 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 also:hstack 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, 6手把手教React Native实战之JSX入门
手把手教你怎么使用 webpack-- webpack 入门指南
超详细!Linux入门之手把手教你shell脚本编程(字符串环境变量运算符)