Python科学计算与数据处理—ndarray对象_第1页
Python科学计算与数据处理—ndarray对象_第2页
Python科学计算与数据处理—ndarray对象_第3页
Python科学计算与数据处理—ndarray对象_第4页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Python 科学计算与数据处理 ndarray对象NumPy 快速处理数据 NumPyndarray 对象目录 NumPy 导入创建数组访问元素多维数组结构数组 NumPy 导入标准 Python 使用列表保存一组可用作数组的值。然而,由于列表的元素可以是任何对象, 所以存储在列表中的是指向该对象的指针。对于数值计算来说, 这种结构显然浪费了内存和 CPU 计算。 Python 提供了数组模块,它不同于列表,可以直接存储数值。但是,它不适合数值计算,因为它不支持多维数组,也没有各种运算功能。数位币的引入弥补了这些不足。NumPy 提供了两个基本对象:ndarray(ndimensiallar

2、yobject)和 ufunc(universalfunctionobject)。Ndarray(以下统称为array)是一个存储单一数据类型的多维数组,而 ufunc 是一个可以处理该数组的函数。函数库导入导入创建数组在IPython 中输入函数名,并添加一个符号以显示文档内容。例如,输入 nparray 可以通过将 Python 的序列对象传递给数组函数来创建数组。如果传递多级嵌套序列,将创建多维数组(以下示例中的变量 c):create array a = NP array(,)b = nparray(,)c= nparray(,)Barry(, )carry(,cdtype# arra

3、y的元素类型可以通过 dtype 属性 (# int #) 获得。创建的数组的大小可以通过其shape属性获得 :可以通过修改数组的shape 属性来更改数组的每个轴的长度,同时保持数组元素的数量不变。Ashape#一维数组 (,)cshape #二维数组,其中第一个轴的长度等于第一个轴的长度。(,)cshape=,#请注意,从 (,)更改为 (,)不会转置数组,而只会更改每个轴的大小。数组元素在内存中的位置没有改变:carry(,)创建数组 d = reshape(,)#使用数组的 resume方法,可以在原始数组的形状不变的情况下创建大小已更改的新数组。D 数组 (,)数组 A 数组 (,

4、)C 形状 =,#当轴的元素为 #时,轴的长度将根据数组元素的数量自动计算, 因此下面的程序将数组 C的形状更改为 (,)。Carray(、)创建阵列阵列 A 和 D 实际上共享一个数据存储内存区域, 因此修改其中一个阵列的元素将同时修改另一个阵列。A=#将数组元素也已更改为数组型属性获得。A 的第一个元素更改为 d#请注意,数组 D 中的(,)创建数组数组的元素类型可以通过数据类您 可 以 在 创 建 时 通 过dttype参 数 指 定 元 素 类型:nparray(,dt type = NP float)array(,dt type = NP complex)array(j,j,j,j,

5、j,j,j,j ,j ,j ,j) 创建数组。上面的例子都是先创建一个 Python 序列,然后通过数组函数把它转换成一个数组,这显然是低效的。因此, NumPy 提供了许多专门用于创建数组的函数。 bullarange 函数类似于 python 的 range 函数。它通过指定起始值、结束值和步长来创建一维数组。 请注意,该数组不包含结束值 :n数组 (,)数组(,)创建数组布尔空间函数通过指定起始值、结束值和元素数来创建一维数组。 您可以指定是否通过endpoint 关键字包含结束值。默认设置是包含结束值:NP LINSPACE( ,#步长为数组(,)NP LINSPACE( ,端点 =

6、False) #步长为数组,创建数组bulllogspace 函数与 LINSPACE 类似,但它创建几何级数。以下示例使用元素生成 ()到()、几何级数 :NPLOGSPACE(,)数组 (,)创建数组零 ()、1()、空 ()以创建指定形状和类型的数组。此外,zeroslike()、one like()、empty like()等函数可以创建与参数数组形状和类型相同的数组。所以 zerosike (a)和 zerosike (ashape,adtype)具有相同的效果。Npempty(,),npint)#只分配内存,不初始化内存数组 (,),NP 零(,npfloat) #元素类型默认为n

7、pfloat,因此可以省略数组 (,)来创建数组。此外,函数如从缓冲区、从字符串、从文件到函数可以用来从字节序列、文件创建数组。下面是fromfunction的一个例子:npfromfunction ?fromfunction 函数的第一个参数是计算每个数组元素的函数。第二个参数是数组的形状。def func (I):returnninpfrom function(func ,()数组 (,)创建一个数组以下示例创建一个二维数组来表示数组中的每个元素ai,j 99 乘法表的输出等于func(I ,j): deffunc (I ,j):return(I)*(j)a=npfromfunction(

8、func,(,)a数组(, )访问元素数组中的元素的方法与Python 的标准方法相同 :A = n 数组 ()a#数组中的元素可以通过使用整数作为下标A 来获得 :#数组的一部分可以通过使用范围作为下标A 来获得,但不包括ArrayA( ,),a:#开始下标的省略表示数组(, )A:#下标可以使用负数来表示数组(, ,)a:=,#下标也可以用来修改元素的值ArrayA( ,)a: #范围中的第三个参数表示步长表示每隔一个元素取一个元素来访问元素 ArrayA( ,)a: #省略范围的开始下标和结束下标,步长表示整个数组上下颠倒。 )a:#当步长为负时,开始下标必须大于结束下标数组 (,),访

9、问元素不同于 Python 的列表序列。通过下标范围获得的新数组是原始数组的视图。它与原始数组共享相同的数据空间 :b=a:#通过下标范围创建一个新数组 bb,a 共享相同的数据空间 Barry(,)b = #将 b 的第一个元素更改为 Barry(,)a 的第一个元素也更改为数组 (,)访问元素除了使用下标范围访问元素之外, mPy 还提供了两种高级的访问元素方法。使用整数序列使用整数序列访问数组元素时, 整数序列中的每个元素都将用作下标。整数序列可以是列表或数组。使用整数序列作为下标的数组不会与原始数组共享数据空间。X = NPAREAR( ,)xarray(,)访问元素 X ,获取带下标

10、的 X 中的元素,以形成新的数组数组(,)b=xnparray(,)#下标可以为负 b=barray(,)x#因为 B 和X 不共享数据空间,所以X 中的值没有改变数组 (,)X ,=,#整数序列下标也可以用于修改元素的值,XARRAY( , )在使用布尔数组 B 作为下标访问元素时使用布尔数组访问元素使用布尔数组作为下标获得的数组不与原始数组共享数据空间。请注意,此方法仅对应于布尔数组。无法使用布尔列表。x = n 数组 (,)访问元素 xnparray(真,假,真,假,假 )#元素的下标在布尔数组中为真,所以获取元素数组(,),下标在 x x x中为真,假,真,假,假 #如果是布尔列表,将

11、真视为真。False 作为数组 (,)xnparay(真,假,真,真 )#如果布尔数组的长度不够,所有不够的部分都作为数组(,xnparay(真,假,真,真 )=,#布尔数组下标也可以用来修改元素xarray(,)access元素布尔数组一般不是手工生成的,而是使用布尔运算的ufunc 函数生成的。X=nprandomrand()#生成一个长度为元素值xarray(,)的随机数数组,访问元素x#数组 x 中的每个元素,并比较大小以获得一个布尔值数组true,表示 x 中的相应值大于数组 (true,true,true,false,false,true,false,True, False,Tru

12、e,dt type = bool)xx # 使用由 x 返回的布尔数组来收集x 中的元素,因此结果是所有大于x 的元素的数组 (,)。多维数组多维数组对一维数组具有类似的访问权限,因为多维数组有多个轴,所以其下标需要多个值来表示NumPy。元组用作数组的下标。如下图所示, A 是 x 的数组图。每个下标及其对应的选择区域通过颜色来区分。组件不需要括号。虽然在 Python 中我们经常使用括号来括起组件,但是组件的语法定义只需要逗号分隔。例如, x,y=y,x 是与组件交换变量值的示例。下图显示了多维数组。 每个下标和它对应的选择区域在数组图中用颜色区分。如何创建多维数组 :数组 a 实际上是一

13、个加法表,纵轴为、 、值,横轴为、值。垂直轴的每个元素和水平轴的每个元素相加, 得到图中所示的阵列 A。您可以使用以下语句创建它。还可以使用整数序列和布尔数组来访问多维数组。多维数组 bulla(,),(),(,):用于访问数组的下标和仍然是一个包含两个元素的元组元素。 元组元素中的每个元素是分别对应于数组的第一轴和第一轴的整数序列。从两个序列的相应位置取两个整数,形成下标 :a、a、. Bulla: ,:下标中的第一个轴是一个范围。它选择第一行之后的所有行。第一个轴是一个整数序列。它选择、和第三列。Bullamask:下标的第一个轴是选择第一行的布尔数组,第一个轴是选择第一列的整数。结构数组

14、假设需要定义一个结构数组,其中每个元素都有名称、年龄和权重字段。在NumPy中 , 它 可 以 定 义 为 如 下 : 文 件名 :NUMPYSTRUCATORYAMPYANSPERSONTYPE = NPD 类型 (#NAMES #:# NAME # # # AGE # # # WEIGHT # # # FORMITIONS #:#S # # # I # # F # )A = NP 数组 (Zhang,),(Wang,),dtype =PERSONTYPE)runnumpstructarypyadtypeTYPE(# NAME # # | S #),(#AGE # # I #),(# WEI

15、GHT # # F #) 结构数组一种描述方式类型描述之前为我们添加了 |lsquo。诸如 的字符用于描述字段值的字节顺序 :bull|:忽略字节顺序bull:bull 前的低字节 :结构数组结构数组前的高字节与一般数组具有相同的访问方式。请注意,元素的值看起来像一个组件。实际上,它是一个结构:A 是一个结构元素,它与数组A 共享内存数据。因此,可以通过修改其字段来更改原始数组中的相应字段 :a(#Zhang#,)adtypedtype(# name # # | S #),(# age# # I #),(#weight#, #f#)c=acname=LianameLi 结构数组结构像字典一样可

16、以通过字符串下标得到它对应的字段值 :不仅可以得到结构元素的某个字段,还可以直接得到结构数组的字段它返回原数组的视图, 因此,您可以通过修改b 来更改 alsquoagelsquo:b = a:age # Or ageb array(,)b = aagename # Zhang # numpyufunc操作目录 ufunc 操作介绍广播 ufunc 方法 ufunc 操作介绍 ufunc 是 universalfunction 的缩写,它是一个可以对数组的每个元素进行操作的函数。NumPy 的许多内置 ufunc 函数都是在 C 语言级别实现的,因此它们的计算速度非常快。#数组 X 中每个元素

17、的正弦计算返回一个相同大小的新数组X = NP LINSPACE( ,* NPPI) ,Y = NPSIN (X) YARRAY (E ,E,E,E,E,E,E,E,E)u unc。计算后, X 中的值没有改变,但创建了一个新数组来保存结果。如果要将 sin 函数计算的结果直接覆盖到数组 x,可以将要覆盖的数组作为第二个参数传递给 ufunc 函数。例如 :t = npsin (x,x) xarray (e,E,E,E,E,E,E,E)id(t)= = id(x)Trueuunc 操作简介将 Python 标准库的 numpymath 和 mathsin 的计算速度与以下小程序进行比较:(nu

18、mpyspeedtestpy)importtimeimportmathemimportnumpyasnpx = I *foriinxrange()Start=timeclock()fori,tinenumerate(x):Xi=mathsin(t)print mathsin这是因为 numpysin 的 c 语言的内部实现比mathsin 的复杂得多,以便支持数组和单个值的计算。核物理比数学快很多倍。这有利于在 c 语言级别循环计算numpysin。num physin 也支持单个数字的正弦计算,但mathsin 比单个数字的 num physin 快得多。Ufunc 操作简介此外,numph

19、ysin 返回的数字类型不同于mathsin 返回的数字类型, math sin 返回的是 Python 的标准浮点类型,而 numphysin 返回的是 numpyfloat 类型 :因为它们的长度不同,所以不建议在导入过程中使用 * 符号加载它们,而是以 importnumpyasnp的方式加载它们,以便根据需要选择适当的函数调用。类型 (mathesin()类型 # float #类型 (npsin()类型 # numpyfloat# ufunc操作简介四个操作 :NumPy 有许多 ufunc 函数来提供各种计算。A = NPARRANGE( , )ArrayArray( , , )B

20、 =NPARRANGE( ,)BARRAY( ,)NPadd (A,B) ARRAY( ,)NPADD (A ,B,A) # 的第一个参数指定计算结果要写入的数组。如果指定,ADD函数将不会生成新数组。由于 Python 的运算符重载函数,两个数组的相加可以简单地写成 ab,而 npadd(a,b,a)可以表示为 a = b。下面是数组运算符及其相应的ufunc 函数的列表。请注意,除法数字 lsquorsquolsquorsquo的含义因 futuredivision 是否激活而异。Y = xx: 加(x,x,y) y = xx: 减(x,x,y) y = x * x: 乘(x,x,y)y

21、= xx: 除 (x , x , y) 。如果两个数组的元素是整数,除以整数y=xx:truedivide(x ,x,y),总是返回精确的商y=xx:floordivide(x ,x,y),总是舍入返回值y = x: 负(x ,y) y = x * * x: 乘方 (x,x,y) y = xx:余数 (x,x,y),mod (x,x,y) ufunc 操作简介数组对象支持这些运算符,以大大简化公式的编写,但请注意,如果公式复杂,并且要操作的数组是例如,假设 abc 的三个数组由公式 x=a*bc 计算,那么它等价于 :也就是说,需要生成一个数组 t 来存储计算的乘法结果, 然后生成最终结果数组

22、 x。我们可以通过手动将一个方程分解成 x = a * bx = c 来减少一个内存分配。T=a*bx=tcdeltufunc 操作介绍比较和布尔操作:使用比较运算符比较两个数组, 如=、将返回一个布尔数组, 其每个元素值是两个数组中相应元素的比较结果。例如 :nparray(,)nparray(,)array (true,false,false,dt type= bool)ufunc 操作介绍每个比较运算符也对应一个ufunc 函数下面是比较运算符及其uf unc 函数 :y=x=xequal(x ,x,y)y=x != xnoteqal (x,x,y) y = xxless (x,x,y)

23、y = x = xlessequl(x,x,y) y = xxgreater (x,x,y) y = x = xgreaterequest (x,x,y) ufnc 操作介绍 Python 中的布尔操作只能通过相应的ufnc 函数执行,因为不能使用and 、或 and 等关键字重载布尔操作。这些函数名都以逻辑开头。在IPython 中使用自动完成来查找它们 a = n arange()b = n arange(,a = = barray (false,false,true,false,false,dt type = bool)a array(false,false,false,true,tru

24、e,true, Dtype = bool)n paricor(a = = b,ab) #和 a=b 是同一个数组 (false,false,true,true,true,dttype = bool) ufunc 操作介绍可以使用数组的任何 ()或 all() 方法。只要数组中的一个值为真,Any() 就会返回真;只有当数组中的所有元素都为真时,any()才会返回真。Npany (a = = b) truenpany (a = = b)和 npaney (ab) trueufunc操作介绍自定义uffunc 函数 :各种公式的数组计算可以通过组合标准的uffunc 函数调用来实现。然而,有时这个

25、公式不容易编写, 并且每个元素的计算函数很容易在 Python 中实现。此时, frompyfunc 函数可用于将计算单个元素的函数转换为ufunc 函数。这样,就可以用生成的ufunc 函数轻松计算数组。ufunc 运算简介用分段函数描述三角波的三角波如下:ufunc运算简介根据上图,写出计算三角波某一点y 坐标的函数 :显然,三角波函数只能计算一个单一值,不能直接处理数组。deftrianglewave(x,c,c, Hc):x=xint(x)# 三角波的周期是,因此,计算时只采用x 坐标的小数部分ifx = c:r = elifxc:r = xc *hcelse:r =(CX)(cc)*

26、 hcreturnufunc 操作简介 :您可以首先使用列表包含来计算列表,然后使用数组函数将列表转换为数组:此方法要求每次都使用列表包含语法来调用函数,这对于多维数组来说非常麻烦。让我们来看看如何使用 frompyfunc 函数来解决这个问题 :x = 空间 ( , )y = nparray(三角波 (t , )fortinx) ufunc 操作简介通过frompyfunc() ,一个计算单个值的函数可以转换成一个可以计算数组中每个元素的 ufunc 函数。Frompyfunc() 的调用格式是 :func 是计算单个元素的函数, nin 是 func 的输入参数数, nout 是 func

27、 的返回值数。下面的程序使用 frompyfunc() 将 trianguve()转换为 ufunc 函数对象triangleufunc: frompyfunc(func , nin, nout) ufunc 操作介绍triangleufunc=npfrompyfunc(lambdax:trianguve(x 、 ) , Y=trianglefunc (x) 虽然 trianglewave 函数只有一个参数,但生成的ufunc函数实际上只有一个参数,因为最后三个c、c和HC的中值在整个计算过程中都是固定的。为了满足这个条件, 可以用一个 函数将三角波的参数包起来一次。因此,传递给 frompy

28、func 的函数只有一个参数。triangleufunc=npfrompyfunc(trianglewave, )y=triangleufunc(x ,值得注意的是,triangleufunc()返回的数组的元素类型是 object,因此有必要再次调用数组的 astype()方法,将其转换为双精度浮点数组 :ydtypetype(# object #)y = yttype(NP float)ydtypetype(# float #)Ydtype(# object #)y = yttype(NP float)ydtypetype(# float)of types 参数可以是表示元素类型的字符串或

29、类型列表。使用列表描述返回数组的多个元素类型。下面的程序使用vectorize()来计算三角波 :triangular func =NP vectorize(triangular wave,type = NP float)y = triangular func(x ,最后,验证结果 :npall(y = = y)truen pall(y = = y)truen pall(y = = y)truebroadcast当我们使用 ufunc 函数来计算两个数组时,ufunc 函数将计算这两个数组的相应元素,因此它要求这两个数组具有相同的大小(形状 )。如果两个数组的形状不同,将执行以下广播过程 :广

30、播使所有输入数组与形状最长的数组对齐,形状中不足的部分将在前面填满。输出数组的形状是输入数组形状的每个轴上的最大值。如果输入数组的一个轴和输出数组的相应轴具有相同的长度或长度为,则该数组可用于计算,否则会出现错误。当输入数组的轴的长度为时,沿该轴操作时, 将使用该轴上的第一组值。无线电看到一个实际的例子。首先创建一个带有形状(,)的二维数组 A: 然后创建一个带有形状 (,)的一维数组 B:A = NPARGE(,)RESHAPE(,)a shape(,B = NPARGE(,BARRAY( ,)BShape(,),广播 A 和 B 的和以获得一个加法表,它相当于计算 A, b 中所有元素组的

31、总和将获得一个形状为 (,)的数组 :c = abcarray(,)c shape(,)广播,因为 a 和 b 的形状长度 (即 ndim 属性 )不同,b 的形状需要根据规则与 a 对齐,因此 b 的形状将填充为 (,)。这相当于以下计算 :此加法运算的两个输入数组的形状分别为(,)和 (,)。根据输出数组各轴的长度是输入数组各轴长度的最大值的规则,输出数组的形状为 (,)。Bshape =,桶形 (,)广播由于 b 的第一轴上的长度为, a 的第一轴上的长度为, 为了将它们添加到第一轴上, 需要将 b 的第一轴 上 的 长 度 扩 展 到 等 效 长 度 :b = b 重 复 ( , 轴

32、=) 桶 形(,)广播,因为 a 的第一轴的长度为, b 的第一轴的长度为, 为了使它们能够在第一轴上相加,需要将第一轴上的 a 的长度扩展为等于 :在上述处理之后, a 和 b 可以根据相应的元素执行相加操作。A=重复(,axis=)a重复(,如果是这样,那就太浪费空间了。因为这种广播计算非常常见,所以numpy 提供了一种快速生 成 数 组a 和b的 方 法 , 如 上 所 示 :ogrid对 象 :x , y=npogrid:,:xarray(,)yarray(,)broadcast ogrid 是一个非常有趣的对象。像多维数组一样, 它使用切片组件作为下标来访问和返回一组可用于广播计算

33、的数组。其切片下标有两种形式:布尔起始值 :结束值 :步长和n 数组(起始值、结束值、步长 )类似于布尔起始值 :结束值 :长度 J 当第三个参数是虚数时,它表示返回数组的长度,n 数组空间 (起始值、结束值、长度 )类似 :为什么广播 ogrid 不是函数 :根据 Python 语法,冒号分隔的切片语法只能用在括号中; 如果 ogrid 是一个函数,那么必须使用 slice函数创建这些切片,这显然会增加代码的长度。x,y = npogrid: j ,:jxaray(,)yarray(,)广播使用 ogrid 的返回值可以轻松计算 x, y 网格表面上每个点的值或 x,y,z 网格体上每个点的

34、值。以 下 是 绘制 三 维 曲 面 的 步骤X*exp(X*Y*)(numpreyoridmlabpy)importnumpyasfromayaviimportmlabx ,Y = NPOgrid:j:JZ = X * npexp(X * * Y * *)PL = mlabsurf(X,Y,Z,WARP SCale= AUTO)MLabaxes(XLABEL = # X # ,YLABEL = # Y # ,ZLABEL = # Z #)MLAboutline(PL)MLABSHOW 广播此程序使用 mayavi 的关于MLAB 的相关内容将在以后的章节中介绍。Ufunc 函数本身有一些方法

35、只对两个输入和一个输出ufunc函数有效。调用这些方法时, 其他 ufunc 对象将引发 ValueError 异常。reduce 方法类似于 Python 的 reduce 函数,因为它操作npaddresseduce(,# npaddresseduce(,axis =) #(,()数组 (,axis =) 数组 (,)ufunc 的方法 accumulate方法类似于 reduce 方法,只是它返回的数组形状和输入数组相同。保存所有中间计算:NPAddAccumulation(,)数组 (, )NPAddAccumulation(,轴 =)数组 (,)Ufunc 的方法 reduceat方

36、法计算多组 Reductions的结果。一系列缩减的开始和结束位置通过索引参数指定。变径的计算有一些特点。让我们用一个例子来解释:a =nparray(, , ,)result=npaddresseduate(a ,indicators=,)resultarray(,)ufunc 的方法调用 reduce 函数来计算 indicators中每个元素的值, 因此最终计算结果的长度与indicators 的长度相同。结果结果数组中除最后一个元素之外的所有元素的计算如下 : 而 最 后 一 个 元 素 的 计 算 如 下 :ifindiceiindicesi:resulti=NPreduce(aindicesi:indiciESI)否则:resulti=aindicesinpreduce(aindicesinpreduce:)。因此,对于上述示例中的结果的每个元素, Ufunc 的方法计算如下 :可以看到结果 :和 a 相等,而结果:和 npaddaccumulate(a (a)相等。:A =: A =: AA =: A =: AAA = =: A =: AAAA = = 乌芬克方法外部方法 (A ,b)该方法的计算相当于以下程序 :挤压的功能是消除数组 A 中的长度轴如果你不太理解这个等价过程,你可以看一个例子:a sha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论