1、 Python是数据科学家最喜欢的语言之一。是数据科学家最喜欢的语言之一。Python本身就本身就是一门工程性语言,数据科学家用是一门工程性语言,数据科学家用Python实现的算法,可以实现的算法,可以直接用在产品中。直接用在产品中。Python的科学计算方面相关类库非常多,常用的有:的科学计算方面相关类库非常多,常用的有:NumPy、SciPy、Matplotlib、Pandas、StatsModels、Scikit-Learn、Keras、Gensim等。高性能的科学计算类库等。高性能的科学计算类库NumPy和和SciPy,给其他高级算法打了非常好的基础,给其他高级算法打了非常好的基础,M
2、atplotlib让让Python画图变得像画图变得像Matlab一样简单。一样简单。学习重点或难点:学习重点或难点:NumPy的基本使用的基本使用 SciPy的基本使用的基本使用 Matplotlib的基本使用的基本使用 NumPy是一个定义了数值数组和矩阵类型和它们的基是一个定义了数值数组和矩阵类型和它们的基本运算的语言扩展;本运算的语言扩展;SciPy是另一种使用是另一种使用NumPy来做高等数来做高等数学、信号处理、优化、统计和许多其它科学任务的语言扩学、信号处理、优化、统计和许多其它科学任务的语言扩展;展;Matplotlib是一个帮助绘图的语言扩展。是一个帮助绘图的语言扩展。Num
3、Py、SciPy、Matplotlib堪称为堪称为Python科学计算的三剑客。科学计算的三剑客。10.1 NumPy等的安装等的安装10.2 NumPy基本应用基本应用10.3 SciPy基本应用基本应用10.4 Matplotlib基本应用基本应用10.5 数据分析模块数据分析模块pandas(1)安装)安装Numpy(numpy.org)cmd管理员模式(启动命令窗口),输入:管理员模式(启动命令窗口),输入:pip install numpy。numpy会自己会自己开始下载安装,等待它提示成功即可。开始下载安装,等待它提示成功即可。(2)安装)安装SciPy(scipy.org)打开打
4、开 https:/sourceforge.Net/projects/scipy/files/scipy/0.15.1/。有很多个压。有很多个压缩包,找到适合缩包,找到适合Python 2.7.x并且下载量比较多的某个并且下载量比较多的某个exe版,运行之一直下一步版,运行之一直下一步就就OK。(3)安装)安装MatPlotLib(matplotlib.org)cmd管理员模式,直接复制粘贴下面的命令,安装完成后会提示完成,就管理员模式,直接复制粘贴下面的命令,安装完成后会提示完成,就OK了。了。python-m pip install-U pip setuptools python-m pip
5、 install matplotlib 因为因为MatplotLib的使用需要的使用需要Numpy的支持,所以应先装的支持,所以应先装NumPy再装再装MatplotLib。另外,另外,Numpy、SciPy、MatplotLib也都可以下载它们的也都可以下载它们的exe文件来安文件来安装,下载地址:装,下载地址:NumPy:http:/ 其中,其中,NumPy和和SciPy没有没有32和和64位的区别,位的区别,MatPlotLib需要根据自需要根据自己的系统选择己的系统选择32位和位和64位的。再次提醒,这三个库一定都要下载对应版位的。再次提醒,这三个库一定都要下载对应版本的本的exe文件
6、。下载完成后依次安装就可,它们会自动找到之前安装好文件。下载完成后依次安装就可,它们会自动找到之前安装好的的Python所在的路径的。所在的路径的。实际上,实际上,Numpy、SciPy、MatplotLib的安装还可以下载安装包实现的安装还可以下载安装包实现。譬如,下载相应的。譬如,下载相应的Numpy安装包(安装包(.whl格式的)。安装时,先进入格式的)。安装时,先进入whl安装包的存放目录。再使用命令行安装:安装包的存放目录。再使用命令行安装:pip install numpy文件名文件名.whl。在在Linux下安装下安装Numpy、SciPy、MatplotLib一般通过如下命令实
7、现:一般通过如下命令实现:1)apt install python-pip/python3-pip#安装安装pip 或或 pip32)pip/pip3 install numpy#给给 Python2.x/Python3.x 安装安装3)pip/pip3 install scipy#给给 Python2.x 安装安装/Python3.x 安装安装4)pip/pip3 install matplotlib#给给 Python2.x 安装安装/Python3.x 安装安装 安装后,证明安装后,证明Numpy、SciPy、MatplotLib是否安装成功。分别是否安装成功。分别import nump
8、y、import scipy、import matplotlib试着导入。如果没报错一般就安试着导入。如果没报错一般就安装好了,并可试着使用。装好了,并可试着使用。例如例如:使用使用Numpy:import numpy as npprint(np.random.rand(4,4)#输出一个随机的输出一个随机的44的矩阵的矩阵 NumPy提供了两种基本的对象:提供了两种基本的对象:ufunc(Universal Function Object)ndarray(N-dimensional array object)ndarray(下文统一称之为数组下文统一称之为数组)是存储单一数是存储单一数据类型
9、的多维数组,而据类型的多维数组,而ufunc则是能够对数组进则是能够对数组进行处理的函数。行处理的函数。示例程序假设用以示例程序假设用以“import numpy as np”“import numpy as np”方式导方式导入入NumPyNumPy函数库。函数库。这样,在这样,在PythonPython交互操作界面,交互操作界面,dir(np)dir(np)能列出能列出NumPyNumPy模块里定义的所有模块、变量和函数等的名称(具模块里定义的所有模块、变量和函数等的名称(具体略)。要获得某个名称的详细帮助信息,可以发体略)。要获得某个名称的详细帮助信息,可以发helphelp命令,如:命
10、令,如:help(np.array)help(np.array)就能获得就能获得arrayarray函数的详细帮助信息,包括使用例子函数的详细帮助信息,包括使用例子等。等。后续模块的学习使用都应该参照这里后续模块的学习使用都应该参照这里dir()dir()与与help()help()函数的使用方法。函数的使用方法。1 1、创建、创建 首先需要创建数组才能对其进行其它操作。首先需要创建数组才能对其进行其它操作。可以通过给可以通过给arrayarray函数传递函数传递PythonPython的序列对的序列对象创建数组,如果传递的是多层嵌套的序列,将象创建数组,如果传递的是多层嵌套的序列,将创建多维
11、数组创建多维数组(下例中的变量下例中的变量c)c):a=np.array(1,2,3,4)a=np.array(1,2,3,4)b=np.array(5,6,7,8)b=np.array(5,6,7,8)c=np.array(1,2,3,4,4,5,6,7,7,c=np.array(1,2,3,4,4,5,6,7,7,8,9,10)8,9,10)b#array(5,6,7,8)b#array(5,6,7,8)c carray(1,2,3,4,4,5,6,7,7,8,9,10)array(1,2,3,4,4,5,6,7,7,8,9,10)c.dtype#dtype(int32)c.dtype#d
12、type(int32)数组的大小可以通过其数组的大小可以通过其shapeshape属性获得:属性获得:a.shape#(4,)a.shape#(4,)c.shape#(3,4)c.shape#(3,4)2 2、存取元素、存取元素 数组元素的存取方法和数组元素的存取方法和PythonPython的标准方法相同:的标准方法相同:a=np.arange(10)a=np.arange(10)a5#5#a5#5#用整数作为下标可以获取数组中的某个元素用整数作为下标可以获取数组中的某个元素 a3:5 a3:5#用范围作为下标获取数组的一个切片,包括用范围作为下标获取数组的一个切片,包括a3a3不包括不包括
13、a5a5array(3,4)array(3,4)a:5 a:5#array(0,1,2,3,4)#array(0,1,2,3,4)#省略开始下标,表示从省略开始下标,表示从a0a0开始开始 a:-1#a:-1#下标可以使用负数,表示从数组后往前数下标可以使用负数,表示从数组后往前数array(0,1,2,3,4,5,6,7,8)array(0,1,2,3,4,5,6,7,8)a2:4=100,101#a2:4=100,101#下标还可以用来修改元素的值下标还可以用来修改元素的值 a#array(0,1,100,101,4,5,6,7,8,9)a#array(0,1,100,101,4,5,6,
14、7,8,9)a1:-1:2#a1:-1:2#范围中的第三个参数表示步长,范围中的第三个参数表示步长,2 2表示隔一个元表示隔一个元素取一个元素素取一个元素array(1,101,5,7)array(1,101,5,7)a:-1#a:-1#省略范围的开始下标和结束下标,步长为省略范围的开始下标和结束下标,步长为-1-1,整个,整个数组头尾颠倒数组头尾颠倒array(9,8,7,6,5,4,101,100,1,0)array(9,8,7,6,5,4,101,100,1,0)a5:1:-2#a5:1:-2#步长为负数时,开始下标必须大于结束下标步长为负数时,开始下标必须大于结束下标array(5,1
15、01)array(5,101)3 3、使用整数序列、使用整数序列 当使用整数序列对数组元素进行存取时,将当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。得的数组不和原始数组共享数据空间。x=np.arange(10,1,-1)x=np.arange(10,1,-1)x#array(10,9,8,7,6,5,4,3,2)x#array(10,9,8,7,6,5,4,3,2)x3,3,1,8#x3,3,1,8
16、#获取获取x x中下标为中下标为3,3,1,83,3,1,8的的4 4个元素,组成一个元素,组成一个新数组个新数组array(7,7,9,2)array(7,7,9,2)b=xnp.array(3,3,-3,8)#b=xnp.array(3,3,-3,8)#下标可以是负数下标可以是负数 b2=100 b2=100 b#array(7,7,100,2)b#array(7,7,100,2)x#x#由于由于b b和和x x不共享数据空间,因此不共享数据空间,因此x x中的值并没有改变中的值并没有改变array(10,9,8,7,6,5,4,3,2)array(10,9,8,7,6,5,4,3,2)x
17、3,5,1=-1,-2,-3#x3,5,1=-1,-2,-3#整数序列下标也可以用来修改整数序列下标也可以用来修改元素的值元素的值 x#array(10,-3,8,-1,6,-2,4,3,2)x#array(10,-3,8,-1,6,-2,4,3,2)4 4、使用布尔数组、使用布尔数组 当使用布尔数组当使用布尔数组b b作为下标存取数组作为下标存取数组x x中的元中的元素时,将收集数组素时,将收集数组x x中所有在数组中所有在数组b b中对应下标为中对应下标为TrueTrue的元素。使用布尔数组作为下标获得的数组的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对不
18、和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。应于布尔数组,不能使用布尔列表。x=np.arange(5,0,-1)x=np.arange(5,0,-1)x#array(5,4,3,2,1)x#array(5,4,3,2,1)xnp.array(True,False,True,False,False)#array(5,3)xnp.array(True,False,True,False,False)#array(5,3)#布尔数组中下标为布尔数组中下标为0 0、2 2的元素为的元素为TrueTrue,因此获取,因此获取x x中下标为中下标为0 0、2 2的元素的元素 x
19、True,False,True,False,False xTrue,False,True,False,False#如果是布尔列表,则把如果是布尔列表,则把TrueTrue当作当作1,False1,False当作当作0 0,按照整数序列方式获,按照整数序列方式获取取x x中的元素,如:中的元素,如:x1,0,1,0,0 x1,0,1,0,0,则得:,则得:array(4,5,4,5,5)array(4,5,4,5,5)xnp.array(True,False,True,True,False)xnp.array(True,False,True,True,False)array(5,3,2)arra
20、y(5,3,2)xnp.array(True,False,True,True,False)=-1,-2,-3 xnp.array(True,False,True,True,False)=-1,-2,-3#布尔数组下标也可以用来修改元素布尔数组下标也可以用来修改元素 x#array(-1,4,-2,-3,1)x#array(-1,4,-2,-3,1)5 5、多维数组、多维数组 多维数组的存取和一维数组类似,多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下因为多维数组有多个轴,因此它的下标需要用多个值来表示,标需要用多个值来表示,NumPyNumPy采用采用元组元组(Tuple)(T
21、uple)作为数组的下标。如图作为数组的下标。如图10-110-1所示,所示,a a为一个为一个6 6*6 6的数组,图的数组,图中给出了各个下标以及其对应的选择中给出了各个下标以及其对应的选择区域。区域。元组不需要圆括号。虽然前面经元组不需要圆括号。虽然前面经常在常在PythonPython中用圆括号将元组括起来,中用圆括号将元组括起来,但是其实元组的语法定义只需要用逗但是其实元组的语法定义只需要用逗号隔开即可,例如号隔开即可,例如 x,y=y,x x,y=y,x 就是用就是用元组交换变量值的一个例子。元组交换变量值的一个例子。如何创建这个数组?也许会对如何创建如何创建这个数组?也许会对如何
22、创建a a这样的数组感到好奇,数这样的数组感到好奇,数组组a a实际上是一个加法表,纵轴的值为实际上是一个加法表,纵轴的值为0,10,20,30,40,500,10,20,30,40,50;横轴的;横轴的值为值为0,1,2,3,4,50,1,2,3,4,5。纵轴的每个元素都和横轴的每个元素求和,就。纵轴的每个元素都和横轴的每个元素求和,就得到图中所示的数组得到图中所示的数组a a。可以用下面的语句创建它,至于其原理这里略:。可以用下面的语句创建它,至于其原理这里略:np.arange(0,60,10).reshape(-1,1)+np.arange(0,6)np.arange(0,60,10)
23、.reshape(-1,1)+np.arange(0,6)array(0,1,2,3,4,5,array(0,1,2,3,4,5,10,11,12,13,14,15,10,11,12,13,14,15,20,21,22,23,24,25,20,21,22,23,24,25,30,31,32,33,34,35,30,31,32,33,34,35,40,41,42,43,44,45,40,41,42,43,44,45,50,51,52,53,54,55)50,51,52,53,54,55)ufuncufunc是是universal functionuniversal function的缩写,它是的
24、缩写,它是一种能对数组的每个元素进行操作的函数。一种能对数组的每个元素进行操作的函数。NumPyNumPy内置的许多内置的许多ufuncufunc函数都是在函数都是在C C语言级别实语言级别实现的,因此它们的计算速度非常快。现的,因此它们的计算速度非常快。来看一个例子:来看一个例子:x=np.linspace(0,2 x=np.linspace(0,2*np.pi,10)np.pi,10)对数组对数组x x中的每个元素进行正弦计算,返回一个同样大小的新数组中的每个元素进行正弦计算,返回一个同样大小的新数组 y=np.sin(x)y=np.sin(x)y yarray(0.00000000e+0
25、0,6.42787610e-01,9.84807753e-01,array(0.00000000e+00,6.42787610e-01,9.84807753e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-2.44921271e-16)-2.44921271e-
26、16)先用先用linspacelinspace产生一个从产生一个从0 0到到2 2*PIPI的等距离的的等距离的1010个数,然后将其传递个数,然后将其传递给给sinsin函数,由于函数,由于np.sinnp.sin是一个是一个ufuncufunc函数,因此它对函数,因此它对x x中的每个元素求正中的每个元素求正弦值,然后将结果返回,并且赋值给弦值,然后将结果返回,并且赋值给y y。计算之后。计算之后x x中的值并没有改变,而中的值并没有改变,而是新创建了一个数组保存结果。如果希望将是新创建了一个数组保存结果。如果希望将sinsin函数所计算的结果直接覆盖函数所计算的结果直接覆盖到数组到数组x
27、 x上去的话,可以将要被覆盖的数组作为第二个参数传递给上去的话,可以将要被覆盖的数组作为第二个参数传递给ufuncufunc函函数。例如:数。例如:t=np.sin(x,x)t=np.sin(x,x)x xarray(0.00000000e+00,6.42787610e-01,9.84807753e-01,array(0.00000000e+00,6.42787610e-01,9.84807753e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,8.66025404e-01,3.42020143e-01,-3.42020143e-01,-8.
28、66025404e-01,-9.84807753e-01,-6.42787610e-01,-8.66025404e-01,-9.84807753e-01,-6.42787610e-01,-2.44921271e-16)-2.44921271e-16)id(t)=id(x)#True id(t)=id(x)#True NumPyNumPy和和MatlabMatlab不一样,对于多维数组不一样,对于多维数组的运算,缺省情况下并不使用矩阵运算,的运算,缺省情况下并不使用矩阵运算,如果希望对数组进行矩阵运算的话,可以如果希望对数组进行矩阵运算的话,可以调用相应的函数。调用相应的函数。matrixmat
29、rix对象:对象:numpynumpy库提供了库提供了matrixmatrix类,使用类,使用matrixmatrix类创建的是矩阵对象,类创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和它们的加减乘除运算缺省采用矩阵方式计算,因此用法和matlabmatlab十分类似。十分类似。但是由于但是由于NumPyNumPy中同时存在中同时存在ndarrayndarray和和matrixmatrix对象,因此用户很容易将两者弄对象,因此用户很容易将两者弄混。这有违混。这有违PythonPython的的“显式优于隐式显式优于隐式”的原则,因此并不推荐在较复杂的程的原则,因此并不推荐在
30、较复杂的程序中使用序中使用matrixmatrix。下面是使用。下面是使用matrixmatrix的一个例子:的一个例子:a=np.matrix(1,2,3,5,5,6,7,9,9)a=np.matrix(1,2,3,5,5,6,7,9,9)a a*a a*-1-1matrix(1.00000000e+00,1.66533454e-16,-8.32667268e-17,matrix(1.00000000e+00,1.66533454e-16,-8.32667268e-17,-2.77555756e-16,1.00000000e+00,-2.77555756e-17,-2.77555756e-1
31、6,1.00000000e+00,-2.77555756e-17,1.66533454e-16,5.55111512e-17,1.00000000e+00)1.66533454e-16,5.55111512e-17,1.00000000e+00)因为因为a a是用是用matrixmatrix创建的矩阵对象,因此乘法和幂运算符都变成了矩阵运创建的矩阵对象,因此乘法和幂运算符都变成了矩阵运算,于是上面计算的是矩阵算,于是上面计算的是矩阵a a和其逆矩阵的乘积,结果是一个单位矩阵。和其逆矩阵的乘积,结果是一个单位矩阵。矩阵的乘积可以使用矩阵的乘积可以使用dotdot函数进行计算。对于二维数组,它计算
32、的是矩函数进行计算。对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是其点积或内积(两一维数组对应元素乘阵乘积,对于一维数组,它计算的是其点积或内积(两一维数组对应元素乘积之和)。当需要将一维数组当作列矢量或者行矢量进行矩阵运算时,推荐积之和)。当需要将一维数组当作列矢量或者行矢量进行矩阵运算时,推荐先使用先使用reshapereshape函数将一维数组转换为二维数组:函数将一维数组转换为二维数组:a=array(1,2,3)a=array(1,2,3)a.reshape(-1,1)a.reshape(-1,1)array(1,array(1,2,2,3)3)a.reshape(1,-
33、1)#array(1,2,3)a.reshape(1,-1)#array(1,2,3)除了除了dotdot计算乘积之外,计算乘积之外,NumPyNumPy还提供了还提供了innerinner和和outerouter等多种计算乘积等多种计算乘积的函数。这些函数计算乘积的方式不同,尤其是当对于多维数组的时候,更的函数。这些函数计算乘积的方式不同,尤其是当对于多维数组的时候,更容易搞混。容易搞混。dotdot:对于两个一维的数组,计算的是这两个数组对应下对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和标元素的乘积和(数学上称之为内积数学上称之为内积);对于二维数组,;对于二维数组,计算的是
34、两个数组的矩阵乘积;对于多维数组,它的通计算的是两个数组的矩阵乘积;对于多维数组,它的通用计算公式如下,即结果数组中的每个元素都是:用计算公式如下,即结果数组中的每个元素都是:数组数组a a的最后一维上的所有元素与数组的最后一维上的所有元素与数组b b的倒数第二的倒数第二位上的所有元素的乘积和:位上的所有元素的乘积和:dot(a,b)i,j,k,m=sum(ai,j,:dot(a,b)i,j,k,m=sum(ai,j,:*bk,:,m)bk,:,m)下面以两个下面以两个3 3位数组的乘积演示一下位数组的乘积演示一下dotdot乘积的计算结果:乘积的计算结果:首先创建两个首先创建两个3 3维数组
35、,这两个数组的最后两维满足矩阵乘积的条件:维数组,这两个数组的最后两维满足矩阵乘积的条件:a=np.arange(12).reshape(2,3,2)a=np.arange(12).reshape(2,3,2)b=np.arange(12,24).reshape(2,2,3)b=np.arange(12,24).reshape(2,2,3)c=np.dot(a,b)c=np.dot(a,b)dot dot乘积的结果乘积的结果c c可以看作是数组可以看作是数组a,ba,b的多个子矩阵的乘积:的多个子矩阵的乘积:np.alltrue(c0,:,0,:=np.dot(a0,b0)#True np.a
36、lltrue(c0,:,0,:=np.dot(a0,b0)#True np.alltrue(c1,:,0,:=np.dot(a1,b0)#True np.alltrue(c1,:,0,:=np.dot(a1,b0)#True np.alltrue(c0,:,1,:=np.dot(a0,b1)#True np.alltrue(c0,:,1,:=np.dot(a0,b1)#True np.alltrue(c1,:,1,:=np.dot(a1,b1)#True np.alltrue(c1,:,1,:=np.dot(a1,b1)#True 矩阵中更高级的一些运算可以在矩阵中更高级的一些运算可以在Num
37、PyNumPy的线性代数子库的线性代数子库linalglinalg中中找到。例如找到。例如invinv函数计算逆矩阵,函数计算逆矩阵,solvesolve函数可以求解多元一次方程组。函数可以求解多元一次方程组。下面是下面是solvesolve函数的一个例子:函数的一个例子:a=np.random.rand(10,10)a=np.random.rand(10,10)b=np.random.rand(10)b=np.random.rand(10)x=np.linalg.solve(a,b)x=np.linalg.solve(a,b)np.sum(np.abs(np.dot(a,x)-b)np.su
38、m(np.abs(np.dot(a,x)-b)solve solve函数有两个参数函数有两个参数a a和和b b。a a是一个是一个N N*N N的二维数组,而的二维数组,而b b是一个是一个长度为长度为N N的一维数组,的一维数组,solvesolve函数找到一个长度为函数找到一个长度为N N的一维数组的一维数组x x,使得,使得a a和和x x的矩阵乘积正好等于的矩阵乘积正好等于b b,数组,数组x x就是多元一次方程组的解。有关线就是多元一次方程组的解。有关线性代数方面的进一步内容这里略。性代数方面的进一步内容这里略。NumPyNumPy提供了多种文件操作函数方便存取数提供了多种文件操作
39、函数方便存取数组内容。文件存取的格式分为两类:组内容。文件存取的格式分为两类:二进制二进制和和文文本本。而二进制格式的文件又分为而二进制格式的文件又分为NumPyNumPy专用的格专用的格式化二进制类型式化二进制类型和和无格式类型无格式类型。使用数组的方法函数使用数组的方法函数tofiletofile可以方便地将数组中数据以二进制可以方便地将数组中数据以二进制的 格 式 写 进 文 件。的 格 式 写 进 文 件。t o f i l et o f i l e 输 出 的 数 据 没 有 格 式,因 此 用输 出 的 数 据 没 有 格 式,因 此 用numpy.fromfilenumpy.fr
40、omfile读回来的时候需要自己格式化数据:读回来的时候需要自己格式化数据:a=np.arange(0,12)a=np.arange(0,12)a.shape=3,4 a.shape=3,4 a aarray(0,1,2,3,array(0,1,2,3,4,5,6,7,4,5,6,7,8,9,10,11)8,9,10,11)a.tofile(a.bin)a.tofile(a.bin)b=np.fromfile(a.bin,dtype=np.float)#b=np.fromfile(a.bin,dtype=np.float)#按照按照floatfloat类型读入数据类型读入数据 b#b#读入的数
41、据是错误的读入的数据是错误的array(2.12199579e-314,6.36598737e-314,1.06099790e-313,array(2.12199579e-314,6.36598737e-314,1.06099790e-313,1.48539705e-313,1.90979621e-313,2.33419537e-313)1.48539705e-313,1.90979621e-313,2.33419537e-313)a.dtype#dtype(int32)#a.dtype#dtype(int32)#查看查看a a的的dtypedtype b=np.fromfile(a.bin,
42、dtype=np.int32)#b=np.fromfile(a.bin,dtype=np.int32)#按照按照int32int32类型读入类型读入数据数据 b#b#数据是一维的数据是一维的array(0,1,2,3,4,5,6,7,8,9,10,11)array(0,1,2,3,4,5,6,7,8,9,10,11)b.shape=3,4#b.shape=3,4#按照按照a a的的shapeshape修改修改b b的的shapeshape b#b#这次终于正确了这次终于正确了array(0,1,2,3,array(0,1,2,3,4,5,6,7,4,5,6,7,8,9,10,11)8,9,10
43、,11)从上面的例子可以看出,需要在读入的时候设置正确的从上面的例子可以看出,需要在读入的时候设置正确的dtypedtype和和shapeshape才能保证才能保证数据一致。此外,如果数据一致。此外,如果fromfilefromfile和和tofiletofile函数调用时指定了函数调用时指定了sepsep关键字参数的话,关键字参数的话,数组将以文本格式输入输出。数组将以文本格式输入输出。前面所举的例子都是传递的文件名,也可以传递已经打开的文件对象,前面所举的例子都是传递的文件名,也可以传递已经打开的文件对象,例如对于例如对于loadload和和savesave函数来说,如果使用文件对象的话,
44、可以将多个数组储函数来说,如果使用文件对象的话,可以将多个数组储存到一个存到一个npynpy文件中:文件中:a=np.arange(8)a=np.arange(8)b=np.add.accumulate(a)b=np.add.accumulate(a)c=a+b c=a+b f=file(result.npy,wb)f=file(result.npy,wb)np.save(f,a)#np.save(f,a)#顺序将顺序将a,b,ca,b,c保存进文件对象保存进文件对象f f np.save(f,b);np.save(f,c)np.save(f,b);np.save(f,c)f.close()f
45、.close()f=file(result.npy,rb)f=file(result.npy,rb)np.load(f)#np.load(f)#顺序从文件对象顺序从文件对象f f中读取内容中读取内容array(0,1,2,3,4,5,6,7)array(0,1,2,3,4,5,6,7)np.load(f)#array(0,1,3,6,10,15,21,28)np.load(f)#array(0,1,3,6,10,15,21,28)np.load(f)#array(0,2,5,9,14,20,27,35)np.load(f)#array(0,2,5,9,14,20,27,35)SciPySciP
46、y函数库在函数库在NumPyNumPy库的基础上增加了众多的数学、库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。等。SciPy SciPy的帮助信息请访问:的帮助信息请访问:http:/www.scipy.org/http:/www.scipy.org/。1 1、SciPySciPy常数常数 SciPy SciPy有有scipy.constantsscipy.constants常数模块,其中的常数有:常数模块,其中的常
47、数有:from scipy import constants as C from scipy import constants as C C.pi#3.141592653589793#C.pi#3.141592653589793#值值 C.golden#1.618033988749895#C.golden#1.618033988749895#黄金比例黄金比例 C.c#299792458.0#C.c#299792458.0#真空中的光速真空中的光速 C.h#6.62606957e-34#C.h#6.62606957e-34#普朗克常数普朗克常数2 2、SciPySciPy特殊函数特殊函数 sci
48、py.special scipy.special是特殊函数模块。是特殊函数模块。specialspecial模块是一模块是一个非常完整的函数库,其中包含了基本数学函数、特殊个非常完整的函数库,其中包含了基本数学函数、特殊数学函数以及数学函数以及NumPyNumPy中出现的所有函数。常用特殊函数求中出现的所有函数。常用特殊函数求值:值:1 1)伽玛函数,)伽玛函数,gammagamma函数是阶乘函数在实数和复数范函数是阶乘函数在实数和复数范围上的扩展。伽玛函数值计算:围上的扩展。伽玛函数值计算:import scipy.special as S import scipy.special as S
49、 S.gamma(0.5)#1.772458509055159 S.gamma(0.5)#1.772458509055159 S.gamma(1+1j)#gamma S.gamma(1+1j)#gamma 函数支持复数函数支持复数 (0.49801566811835629-0.15494982836181106j)(0.49801566811835629-0.15494982836181106j)S.gamma(1000)#inf#inf S.gamma(1000)#inf#inf是无穷大是无穷大 2 2)对数伽玛函数,)对数伽玛函数,S.gammaln(x)S.gammaln(x)计算计算l
50、n(|gamma(x)|)ln(|gamma(x)|)的值,它使用特殊的算法,直接计算的值,它使用特殊的算法,直接计算gammagamma函数的对数值,函数的对数值,因此可以表示更大的范围。因此可以表示更大的范围。S.gammaln(1000)#5905.2204232091817S.gammaln(1000)#5905.2204232091817 3 3)log1p(x)log1p(x),log1p(x)log1p(x)计算计算log(1+x)log(1+x)的值,当的值,当x x非常非常小时,小时,log1p(x)log1p(x)约等于约等于x x。当使用。当使用log1p()log1p(