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, atleast 2d, atleast 3d, mat。

           操作(manipulations):array 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。

           操作(operations:choose, 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)索引数组的索引

      

当索引数组是多维度的时候,索引数组中的每个值指向的是原来数组中的第一维(也就是顶层)。下面例子就是,image(2*4)索引的是palette(5*3的矩阵)中第一维上不同的子数组,结果为2*4*3的矩阵:

下面就是给出多个索引数组,这时候每个索引数组必须shape一致,这时候可以看成是坐标点的形式:

当然,我们可以将i 和 j  放入一个序列中(一个列表)然后对该列表进行索引:

然而,我们没法将 i 和 j 放入数组中,因为这个数组会被解释成 a 的第一维索引:  

下面是另一个使用索引数组的例子:

可以使用索引数组来对指定元素进行更新:

然而,当索引的列表里面有重复的时候,同一个元素会被更新好几次,并保留最后的更新:

当想要使用python的+=来构建的时候,它的结果也许不像你期望的那样(没有重复更新):

即使0在索引列表中发生了两次。第0个元素只更新一次。这是因为python要求“a+=1”等效于“a = a+1”.

    2)布尔数组的索引

         当我们通过索引(整数)数组来对数组进行索引,我们提供了索引的列表去进行挑选,显式的选择数组中的项是否是我们想要的。对布尔索引的最自然的方式就是使用与原始数组一样shape的布尔数组:

这个特性在赋值的时候很有用:

可以通过查看Mandelbrot set example来了解如何使用布尔索引来生成 Mandelbrot set的图像的。

第二种布尔索引的方式更类似于整数索引,对于数组的每一维来说,我们给它一个1维布尔数组来选择我们想要的分片:

注意到1维布尔数组的长度必须与你想要分片的维度(或者轴)的长度一致。在之前的例子中,b1 是一个 1-rank 的数组,长度为3(在a 中行的数量),和b2 (长度为4)是匹配a 的第二个秩(列)的索引的。

    3)ix_()函数

    ix_function可以组合不同维度的向量,然后按照参数的个数来决定进行多少维度的升级,下面是三个参数,所以ax有三维,如果是四个参数,那么ax就是四维了。例如,按照式子a+b*c来计算向量a,b,c 的所有元素的组合,得到的是一个4*3*5的矩阵:

或者定义函数:

然后像下面这样使用:

与ufunc.reduce(numpy中的方法)相比较,该版本的优势在于它会使用广播规则( 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,:]生成一个shape(1,4)的矩阵。相反地,一个数组的分片总是生成一个最低可能维度的数组。例如,如果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_stackdstackhstack 和 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马Android全套视频无加密完整版

课程描述:java基础到javaweb开发,从基础入门到实战。安卓基础到实战。实体班近5个月的课程实录!!!课程表:xml&dom_sax_dom4j编程tomcat与web程序结构与Http协议与HttpUrlConnectionjava web之servletja…

强大的CSS3动画库animate.css

今天要给大家介绍一款强大的CSS3动画库animate.css,animate.css定义了大概50多种动画形式,包括淡入淡出,文字飞入、左右摇摆动画等等。使用animate.css也非常简单,你可以给页面上的任意元素,特别是文字添加各种神奇的动…

有关系统环境变量的设置问题

不知道各位朋友有没有想过这样用的问题,我们在使用windows使用在cmd下运行Ping、Netstat等之类的命令时,为什么可以使用呢? 这些后面牵涉到哪些东西呢? 我们今天就来介绍下有关这方面的知识。我们现在以win8作为测试对象&#xff…

linux下安装配置jdk(解压版)

在linux下登录oracle官网,下载解压版jdk 传送门系统默认下载到“下载”目录中创建要将该文件解压的文件夹:其中 -p 参数代表递归创建文件夹(可以创建多级目录) 进入到下载目录,将下载好的jdk解压到指定目录配置环境…

谈谈Angular关于$watch,$apply 以及 $digest的工作原理

这篇文章主要是面向那些刚开始学AngularJs和想要了解数据绑定(data-binding)是怎么工作的, 如果你已经熟悉如何使用angularjs了,我强烈建议你不用阅读了。 angularjs使用者想要知道data-binding是如何工作的,就会遇到很…

Tachyon更名为 Alluxio,并发布1.0版本

详细参考 http://www.alluxio.org/releases/alluxio-1-0-0-release.html http://geek.csdn.net/news/detail/57243 http://www.alluxio.org/ Alluxio介绍 Alluxio 1.0版本,作为世界上首款以内存为中心的虚拟分布式存储系统,它能够统一数据访问并成为连接…

一幅长文细学MongoDB(四)——索引

4 索引 文章目录4 索引4.1 概述4.2 索引类型4.3 索引创建4.3 删除索引4.4 查看索引执行计划4.5 涵盖的查询4.1 概述 说明:索引支持在MongoDB中高效地查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择…

【转】Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]

Fresco简单的使用—SimpleDraweeView 百学须先立志—学前须知: 在我们平时加载图片(不管是下载还是加载本地图片…..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该呈现正在加载时的图像,当图片加载失败时应该呈…

对象映射工具AutoMapper介绍

AutoMapper是用来解决对象之间映射转换的类库。对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间。 一. AutoMapper解决了什么问题? 要问AutoMapper解决了什么问题? 难道不是对象…

MindSpore安装教程【简洁易懂】

1 官网 MindSpore官网:MindSpore安装指南 2 关注社区 3 下载 查看自己python版本:使用python -V查看自己python版本 进入官网选择相应配置: 验证是否安装成功:python -c "import mindspore;mindspore.run_check()"&a…

一幅长文细学Vue(十三)——组合式中的生命周期

13 组合式API(四) 摘要:每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被…

OSGI 生命周期

1 生命周期管理 对于非模块化应用,生命周期将应用作为一个整体来操作;而对于模块化应用,则可以以细粒度的方式来管理应用的某一个独立部分。OSGi生命周期管理 OSGi生命周期层有两种不同的作用: 在应用程序外部,定义了对…

tomcat+nginx+redis实现均衡负载、session共享

在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新。但这可能会出现一些状况:1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一)2.不知道的用户…

洛谷 P3184 [USACO16DEC]Counting Haybales数草垛

洛谷 P3184 [USACO16DEC]Counting Haybales数草垛 题目描述 Farmer John has just arranged his NN haybales (1 \leq N \leq 100,0001≤N≤100,000 ) at various points along the one-dimensional road running across his farm. To make sure they are spaced out appropria…

Entity Framework 6 Recipes 2nd Edition(13-2)译 - 用实体键获取一个单独的实体

问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Painting(绘画)类型的实体,如Figure 13-2所示: Figure 13-2. The Painting entity type in our model 在代码In Listi…

C#心得与经验(二)

本周学到很多C#关于Interface, Array的知识&#xff0c;在这里简单复习一下几个易混的地方&#xff0c;重在理解。 一、Interface 使用as来避免多态时没有接口的Exception&#xff1a; Document [] folder new Document[5]; for (int i 0; i < 5; i) {if (i % 2 0){fold…

项目总结(3.28)

项目是用vuewebpackelementUI 完成的。虽然没有什么深奥的技术和难点&#xff0c;但是有些细节还是值得注意的。 1、满足不同屏幕尺寸下缩放全屏显示。 单单只靠宽度、高度百分比是不可以实现的&#xff0c;比如如果宽度设置百分比&#xff0c;当屏幕宽度比较小时&#xff0c;这…

algorand共识协议_【Filecoin】理解预期共识 - 及它的优缺点

摘 要预期共识就是上帝掷飞镖预期共识的优点在于简单&#xff0c;而且每一次选举胜出者数量的平均数为1但预期共识不能保证每次选举的胜出者数量&#xff0c;这是其最大的问题期待有更好的基于可验证随机函数的共识算法出现&#xff0c;设计者可获得20万美金奖赏预期共识 就是 …

c++ 多个线程操作socket要同步吗_基础知识深化:NIO优化原理和Tomcat线程模型

1、I/O阻塞书上说BIO、NIO等都属于I/O模型&#xff0c;但是I/O模型这个范围有点含糊&#xff0c;我为此走了不少弯路。我们日常开发过程中涉及到NIO模型应用&#xff0c;如Tomcat、Netty中等线程模型&#xff0c;可以直接将其视为 网络I/O模型 。本文还是在基础篇章中介绍几种I…

Linux常用命令汇总--ln

1.功能&#xff1a;将一个文件或者文件夹链接到另外一个文件或者文件夹上。链接分为硬链接和软链接&#xff0c;硬链接可以看做是一个文件具有多个访问的入口&#xff0c;软链接可以看成是快捷方式。2.用法&#xff1a;ln [选项] 源文件或目录 目标文件或目录3.参数&#xff1a…