Python科学计算与数据处理.ppt
《Python科学计算与数据处理.ppt》由会员分享,可在线阅读,更多相关《Python科学计算与数据处理.ppt(103页珍藏版)》请在三一办公上搜索。
1、NumPy快速处理数据,1,2,NumPy,ndarray 对象,目录,NumPy的导入创建数组存取元素多维数组结构数组,3,NumPy的导入,标准的Python 中用列表(list)保存一组值,可以当作数组使用。但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针。对于数值运算来说,这种结构显然比较浪费内存和CPU计算Python 提供了array 模块,它和列表不同,能直接保存数值,但是由于它不支持多维数组,也没有各种运算函数,因此也不适合 做数值运算。,4,NumPy的导入,NumPy 的诞生弥补了这些不足,NumPy 提供了两种基本的对象:ndarray(n-dimension
2、al array object)和ufunc(universal function object)。ndarray(下文统一称之为数组)是存储单一数据类型的多维数组,而ufunc 则是能够对数组进行处理的函数。函数库的导入,5,import numpy as np,创建数组,在IPython 中输入函数名并添加一个“?”符号,就可以显示文档内容。例如,输入“np.array?”可以通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(下例中的变量c):,6,创建数组,7,a=np.array(1,2,3,4)b=np.array(5,6,7,8)c
3、=np.array(1,2,3,4,4,5,6,7,7,8,9,10)barray(5,6,7,8)carray(1,2,3,4,4,5,6,7,7,8,9,10)c.dtype#数组的元素类型可以通过dtype 属性获得dtype(int32),创建数组,数组的大小可以通过其shape属性获得:可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。,8,a.shape#一维数组(4,)c.shape#二维数组其中第0 轴的长度为3,第1 轴的长度为4。(3,4),c.shape=4,3#注意从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大
4、小,数组元素在内存中的位置并没有改变:carray(1,2,3,4,4,5,6,7,7,8,9,10),创建数组,9,d=a.reshape(2,2)#使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变。darray(1,2,3,4)aarray(1,2,3,4),c.shape=2,-1#当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度,因此下面的程序将数组c的shape改为了(2,6)。carray(1,2,3,4,4,5,6,7,7,8,9,10),创建数组,数组a和d其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改
5、另外一个数组。,10,a1=100#将数组a的第一个元素改为100 d#注意数组d中的2也被改变了array(1,100,3,4),创建数组,数组的元素类型可以通过dtype属性获得。可以通过dtype参数在创建时指定元素类型:,11,np.array(1,2,3,4,4,5,6,7,7,8,9,10,dtype=np.float)array(1.,2.,3.,4.,4.,5.,6.,7.,7.,8.,9.,10.)np.array(1,2,3,4,4,5,6,7,7,8,9,10,dtype=plex)array(1.+0.j,2.+0.j,3.+0.j,4.+0.j,4.+0.j,5.+0
6、.j,6.+0.j,7.+0.j,7.+0.j,8.+0.j,9.+0.j,10.+0.j),创建数组,上面的例子都是先创建一个Python序列,然后通过array函数将其转换为数组,这样做显然效率不高。因此NumPy提供了很多专门用来创建数组的函数。arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:,12,np.arange(0,1,0.1)array(0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),创建数组,linspace函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoin
7、t关键字指定是否包括终值,缺省设置是包括终值:,13,np.linspace(0,1,10)#步长为1/9array(0.,0.11111111,0.22222222,0.33333333,0.44444444,0.55555556,0.66666667,0.77777778,0.88888889,1.)np.linspace(0,1,10,endpoint=False)#步长为1/10array(0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),创建数组,logspace函数和linspace类似,不过它创建等比数列,下面的例子产生1(100)到100(102)
8、、有20个元素的等比数列:,14,np.logspace(0,2,20)array(1.,1.27427499,1.62377674,2.06913808,2.6366509,3.35981829,4.2813324,5.45559478,6.95192796,8.8586679,11.28837892,14.38449888,18.32980711,23.35721469,29.76351442,37.92690191,48.32930239,61.58482111,78.47599704,100.),创建数组,zeros()、ones()、empty()可以创建指定形状和类型的数组。此外,
9、zeros_like()、ones_like()、empty_like()等函数可创建与参数数组的形状及类型相同的数组。因此,“zeros_like(a)”和“zeros(a.shape,a.dtype)”的效果相同。,15,np.empty(2,3),np.int)#只分配内存,不对其进行初始化array(32571594,32635312,505219724,45001384,1852386928,665972)?np.zeros(4,np.float)#元素类型默认为np.float,因此这里可以省略array(0.,0.,0.,0.),创建数组,此外,使用frombuffer,from
10、string,fromfile,fromfunction等函数可以从字节序列、文件创建数组,下面以fromfunction为例:np.fromfunction?fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape)。,16,def func(i):.return i%4+1.np.fromfunction(func,(10,)array(1.,2.,3.,4.,1.,2.,3.,4.,1.,2.),创建数组,17,下面的例子创建一个二维数组表示九九乘法表,输出的数组a中的每个元素ai,j都等于func2(i,j):,def func2(i,j):
11、.return(i+1)*(j+1).a=np.fromfunction(func2,(9,9)aarray(1.,2.,3.,4.,5.,6.,7.,8.,9.,2.,4.,6.,8.,10.,12.,14.,16.,18.,3.,6.,9.,12.,15.,18.,21.,24.,27.,4.,8.,12.,16.,20.,24.,28.,32.,36.,5.,10.,15.,20.,25.,30.,35.,40.,45.,6.,12.,18.,24.,30.,36.,42.,48.,54.,7.,14.,21.,28.,35.,42.,49.,56.,63.,8.,16.,24.,32.
12、,40.,48.,56.,64.,72.,9.,18.,27.,36.,45.,54.,63.,72.,81.),存取元素,数组元素的存取方法和Python的标准方法相同:,18,a=np.arange(10)a5#用整数作为下标可以获取数组中的某个元素5 a3:5#用范围作为下标获取数组的一个切片,包括a3不包括a5array(3,4)a:5#省略开始下标,表示从a0开始array(0,1,2,3,4)a:-1#下标可以使用负数,表示从数组后往前数array(0,1,2,3,4,5,6,7,8)a2:4=100,101#下标还可以用来修改元素的值 aarray(0,1,100,101,4,5
13、,6,7,8,9)a1:-1:2#范围中的第三个参数表示步长,2表示隔一个元素取一个元素,存取元素,19,array(1,101,5,7)a:-1#省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒array(9,8,7,6,5,4,101,100,1,0)a5:1:-2#步长为负数时,开始下标必须大于结束下标array(5,101),存取元素,和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间:,20,b=a3:7#通过下标范围产生一个新的数组b,b和a共享同一块数据空间 barray(101,4,5,6)b2=-10#将b的
14、第2个元素修改为-10 barray(101,4,-10,6)a#a的第5个元素也被修改为10array(0,1,100,101,4,-10,6,7,8,9),存取元素,除了使用下标范围存取元素之外,NumPy还提供了两种存取元素的高级方法。使用整数序列 当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。,21,x=np.arange(10,1,-1)xarray(10,9,8,7,6,5,4,3,2),存取元素,22,x3,3,1,8#获取x中的下标为3,3,1,8的4个元素,组成一个新
15、的数组array(7,7,9,2)b=xnp.array(3,3,-3,8)#下标可以是负数 b2=100 barray(7,7,100,2)x#由于b和x不共享数据空间,因此x中的值并没有改变array(10,9,8,7,6,5,4,3,2)x3,5,1=-1,-2,-3#整数序列下标也可以用来修改元素的值 xarray(10,-3,8,-1,6,-2,4,3,2),存取元素,使用布尔数组 当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。
16、,23,x=np.arange(5,0,-1)xarray(5,4,3,2,1),存取元素,24,xnp.array(True,False,True,False,False)#布尔数组中下标为0,2的元素为True,因此获取x中下标为0,2的元素array(5,3)xTrue,False,True,False,False#如果是布尔列表,则把True当作1,False当作0,按照整数序列方式获取x中的元素array(4,5,4,5,5)xnp.array(True,False,True,True)#布尔数组的长度不够时,不够的部分都当作Falsearray(5,3,2)xnp.array(Tr
17、ue,False,True,True)=-1,-2,-3#布尔数组下标也可以用来修改元素 xarray(-1,4,-2,-3,1),存取元素,布尔数组一般不是手工产生,而是使用布尔运算的ufunc函数产生。,25,x=np.random.rand(10)#产生一个长度为10,元素值为0-1的随机数的数组 xarray(0.72223939,0.921226,0.7770805,0.2055047,0.17567449,0.95799412,0.12015178,0.7627083,0.43260184,0.91379859),存取元素,26,x0.5#数组x中的每个元素和0.5进行大小比较,得
18、到一个布尔数组,True表示x中对应的值大于0.5array(True,True,True,False,False,True,False,True,False,True,dtype=bool)xx0.5#使用x0.5返回的布尔数组收集x中的元素,因此得到的结果是x中所有大于0.5的元素的数组array(0.72223939,0.921226,0.7770805,0.95799412,0.7627083,0.91379859),多维数组,多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下标需要用多个值来表示,NumPy采用组元(tuple)作为数组的下标。如下图所示,a为一个6x6的
19、数组,图中用颜色区分了各个下标以及其对应的选择区域。组元不需要圆括号 虽然我们经常在Python中用圆括号将组元括起来,但是其实组元的语法定义只需要用逗号隔开即可,例如x,y=y,x 就是用组元交换变量值的一个例子。,27,多维数组,如下图所示,a为一个6x6的数组,图中用颜色区分了各个下标以及其对应的选择区域。,28,多维数组,如何创建这个数组:数组a实际上是一个加法表,纵轴的值为0,10,20,30,40,50;横轴的值为0,1,2,3,4,5。纵轴的每个元素都和横轴的每个元素求和,就得到图中所示的数组a。你可以用下面的语句创建它。,29,np.arange(0,60,10).reshap
20、e(-1,1)+np.arange(0,6)array(0,1,2,3,4,5,10,11,12,13,14,15,20,21,22,23,24,25,30,31,32,33,34,35,40,41,42,43,44,45,50,51,52,53,54,55),多维数组,多维数组同样也可以使用整数序列和布尔数组进行存取。,30,多维数组,a(0,1,2,3,4),(1,2,3,4,5):用于存取数组的下标和仍然是一个有两个元素的组元,组元中的每个元素都是整数序列,分别对应数组的第0轴和第1轴。从两个序列的对应位置取出两个整数组成下标:a0,1,a1,2,.,a4,5。a3:,0,2,5:下标中
21、的第0轴是一个范围,它选取第3行之后的所有行;第1轴是整数序列,它选取第0,2,5三列。amask,2:下标的第0轴是一个布尔数组,它选取第0,2,5行;第1轴是一个整数,选取第2列。,31,结构数组,假设需要定义一个结构数组,它的每个元素都有name,age和weight字段。在NumPy中可以如下定义:文件名:numpy_struct_array.py,32,import numpy as nppersontype=np.dtype(names:name,age,weight,formats:S32,i,f)a=np.array(Zhang,32,75.5),(Wang,24,65.2),
22、dtype=persontype)run numpy_struct_array.py a.dtypedtype(name,|S32),(age,i4),(weight,f4),结构数组,一种描述结构类型的方法:一个包含多个组元的列表,其中形如(字段名,类型描述)的组元描述了结构中的每个字段。类型描述前面为我们添加了|,:高位字节在前,33,结构数组,结构数组的存取方式和一般数组相同,通过下标能够取得其中的元素,注意元素的值看上去像是组元,实际上它是一个结构:a0是一个结构元素,它和数组a共享内存数据,因此可以通过修改它的字段,改变原始数组中的对应字段:,34,a0(Zhang,32,75.5)
23、a0.dtypedtype(name,|S32),(age,i4),(weight,f4),c=a1 cname=Li a1nameLi”结构,结构数组,35,结构像字典一样可以通过字符串下标获取其对应的字段值:不但可以获得结构元素的某个字段,还可以直接获得结构数组的字段,它返回的是原始数组的视图,因此 可以通过修改 b0改变 a0age:,b=a:age#或者aage barray(32,24)b0=40 a0age40,a0nameZhang,36,NumPy,ufunc运算,目录,ufunc运算简介广播ufunc的方法,37,ufunc运算简介,ufunc是universal funct
24、ion的缩写,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。,38,#对数组x中的每个元素进行正弦计算,返回一个同样大小的新数组 x=np.linspace(0,2*np.pi,10)y=np.sin(x)yarray(0.00000000e+00,6.42787610e-01,9.84807753e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-2.44921271
25、e-16),ufunc运算简介,计算之后x中的值并没有改变,而是新创建了一个数组保存结果。如果希望将sin函数所计算的结果直接覆盖到数组x上去的话,可以将要被覆盖的数组作为第二个参数传递给ufunc函数。例如:,39,t=np.sin(x,x)xarray(0.00000000e+00,6.42787610e-01,9.84807753e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-2.44921271e-16)id(t)=id(x)True,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 科学 计算 数据处理
链接地址:https://www.31ppt.com/p-5445811.html