




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第11章科學計算與可視化學習目標掌握數組與矩陣的運算
熟悉SciPy的科學計算
了解數據圖表的繪制
熟悉數據分析工具的使用
熟悉數據的統計分析22025/3/6本章簡介
科學計算是利用計算機再現、預測和發現客觀世界運動規律和演化特性的全過程,是解決科學研究和工程技術問題的基本方法。
Python提供了豐富的科學計算與可視化技術的功能模塊,本章側重于選取其中的基礎方法和工具
本章使用的各類軟件包可以在命令行窗口一次性安裝:
pipinstallnumpyscipymatplotlibpandasstatistics32025/3/611.1數組與矩陣運算42025/3/6列表、數組和矩陣數組與標量的算術運算數組與數組的運算數組的切片與索引數組的函數運算11.1.1列表、數組和矩陣52025/3/6列表
列表和元組是Python的常見序列類型,例如:
一維數組 list1=[1,2,3,'a’]
二維數組 tuple1=([1,2,3],[4,5,6],[7,8,9])
由于列表中的數據類型可以不同,對于列表自身的操作主要是以元素的添加和刪除為主,如append()方法可以添加元素,列表還支持加法+和乘法*的方式來添加元素。 >>>list1+[1,2] >>>list1*2 [1,2,3,'a',1,2] [1,2,3,'a',1,2,3,'a’]因此列表并不能提供數學意義上的數組元素之間的四則運算。11.1.1列表、數組和矩陣62025/3/6數組 NumPy模塊中提供了真正的數組實現,稱為多維數組對象,即ndarray(n-dimensionalarray)。ndarray會將所有元素轉化為同一種類型,該對象可以接收各類序列類型的數據,并將其轉化為數組。
①ndarray數組中的維度(dimensions)又稱為軸(axis)。
②ndarray數組的維數又稱為秩(rank),一維數組的秩
為1,二維數組的秩為2,依此類推,因此秩的數量
也就是軸的個數。要創建ndarray數組,采用numpy.array()方法。
>>>importnumpyasnp
>>>a1=np.array((1,2,3,4))
>>>a2=np.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>>a1
>>>a2
11.1.1列表、數組和矩陣72025/3/6#array([1,2,3,4])#array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])ndarray數組對象的基本屬性11.1.1列表、數組和矩陣82025/3/6屬性說明.ndim數組的秩,即軸的數量或維度的數量.shape數組的維度,表示數組在每個維度上的元素個數,例如二維數組中緯度即表示行數和列數.size數組元素總個數,為shape屬性中元組元素的乘積.dtype數組元素的數據類型.itemsize數組元素占用的字節數.data包含數組元素的內存區域數組的第0軸對應著第一維,第1軸對應著第二維,數組的秩為2,維度為(3,4)的形狀,元素總個數為12。>>>a2.ndim2>>>a2.shape(3,4)>>>a2.size12>>>a2.dtypedtype('int32')>>>a2.itemsize4>>>a2.data<memoryat0x00000235D2472048>11.1.1列表、數組和矩陣92025/3/64×3數組的兩個軸NumPy支持的數據類型11.1.1列表、數組和矩陣102025/3/6類型類型代碼說明int8、uint8i1、u1有符號和無符號的8位(1個字節)整型int16、uint16i2、u2有符號和無符號的16位(2個字節)整型int32、uint32i4、u4有符號和無符號的32位(4個字節)整型int64、uint64i8、u8有符號和無符號的64位(8個字節)整型float16f2半精度浮點數,16位float32f4或f標準的單精度浮點數,32位11.1.1列表、數組和矩陣112025/3/6類型類型代碼說明float64或floatf8或g標準的雙精度浮點數,64位complex64c8用兩個32位浮點數表示實部和虛部complex128或complexc16用兩個64位浮點數表示實部和虛部bool?存儲True和False的值的布爾類型objectoPython對象類型strings字符串類型unicodeuunicode類型NumPy中常見的常量11.1.1列表、數組和矩陣122025/3/6常量說明inf,Inf,Infinity,infty,PINF正無窮NINF負無窮PZERO正零NZERO負零NAN,NaN,nan非數值e自然常數epiπ以下來觀察列表、數組和矩陣維度的差異。11.1.1列表、數組和矩陣132025/3/6>>>importnumpyasnp >>>np.shape(a3)>>>lst=[1,2,3,4] (1,4)>>>np.shape(lst) >>>a3(4,) matrix([[1,2,3,4]])>>>a1=np.array(lst) >>>a4=np.matrix(([1,2,3,4],[5,6,7,8]))>>>np.shape(a1) >>>np.shape(a4)(4,) (2,4)>>>a2=np.array(([1,2,3,4],[5,6,7,8])) >>>a4>>>np.shape(a2) matrix([[1,2,3,4],(2,4) [5,6,7,8]])>>>a3=np.matrix([1,2,3,4])11.1.1列表、數組和矩陣142025/3/6矩陣 NumPy也定義了矩陣類型(matrix),是一種2維的特殊數組,是多維數組(ndarray)的一個特例。因此,在NumPy中,矩陣被定義為數組的子類,具有很多數組的特性。np.shape()是一個可查看數組維度的函數,等同于數組的shape()方法。矩陣對數據的處理與數組有細微的差別,數組中允許單維度的數據,而矩陣中所有的數據均被處理為雙維度,當輸入為列表數據是,其處理方式是行數為1,列數為列表元素個數的矩陣。11.1.2數組與標量的算術運算152025/3/6算術運算NumPy數組和矩陣在算術運算中的使用與數學定義基本一致。numpy.array()方法的詳細用法: numpy.array(object,dtype=None,copy=True,order='K’, subok=False, ndmin=0)object為待轉換的數據;dtype為數據類型;copy默認為True,會復制一個單獨的對象副本;order指定陣列的內存布局,其中C按行、F按列、A按原順序、K按元素在內存中出現的順序;subok當輸入為矩陣時有效,表示返回的數組是否為子類,默認為False表示采用基類,即數組,若為True,則優先選擇子類,一般為矩陣;ndmin為數組的最小維度。11.1.2數組與標量的算術運算162025/3/6>>>importnumpyasnp>>>a=(1,2,3)>>>b=np.array(a,dtype=np.float)>>>barray([1.,2.,3.])>>>b.dtypedtype('float64')>>>type(b[0])<class'numpy.float64'>>>>c=np.array(a)>>>carray([1,2,3])>>>d=c+1>>>darray([2,3,4])>>>d-1.0array([1.,2.,3.])
首先觀察加減運算,注意其數據類型的變化。11.1.2數組與標量的算術運算172025/3/6>>>a=np.array([1,2,3,4,5],dtype=np.float)>>>b=np.array(a)>>>c=np.array(a,copy=False)>>>b[0]=0>>>b[1]=b[1]/0.>>>barray([0.,inf,3.,4.,5.])>>>a#由于b已建立副本,a未發生改變array([1.,2.,3.,4.,5.])>>>c[0]=0>>>a #由于c未建立單獨副本,a已改變array([0,2,3,4,5])
進行乘除的運算,利用copy參數控制是否建立數組的副本。11.1.2數組與標量的算術運算182025/3/6>>>d=np.array([1,2,3,4,5],ndmin=2)>>>darray([[1,2,3,4,5]])>>>d*2array([[2,4,6,8,10]])>>>e=np.matrix('123;456;789') #適用于矩陣的初始化方法>>>ematrix([[1,2,3],[4,5,6],[7,8,9]])>>>e1=np.array(e,subok=True)>>>e2=np.array(e,subok=False)>>>e1 #允許子類,因此為矩陣matrix([[1,2,3],[4,5,6],[7,8,9]])>>>e2 #不允許子類,因此為數組array([[1,2,3],[4,5,6],[7,8,9]])>>>(e1-1)*2matrix([[0,2,4],[6,8,10],[12,14,16]])>>>e2*2array([[2,4,6],[8,10,12],[14,16,18]])11.1.3數組與數組的運算
數組之間的算術運算
數組之間進行算術運算時,主要是對應的元素之間直接進行運算,因此應保證參與運算的兩個數組維度之間有對應性。192025/3/6>>>importnumpyasnp>>>a=np.array([[1,2,3],[4,5,6]])>>>b=np.ones((2,3),int)*2>>>aarray([[1,2,3],[4,5,6]])>>>barray([[2,2,2],[2,2,2]])>>>a+barray([[3,4,5],[6,7,8]])>>>a-barray([[-1,0,1],[2,3,4]])>>>a*barray([[2,4,6],[8,10,12]])>>>a/barray([[0.5,1.,1.5],[2.,2.5,3.]])11.1.3數組與數組的運算
數組變換
數組對象的.T屬性提供轉置的數組,維度變換可以采用np.reshape()。202025/3/6>>>a=np.array(([1,2,3],[4,5,6],[7,8,9]))>>>aarray([[1,2,3],[4,5,6],[7,8,9]])>>>a.Tarray([[1,4,7],[2,5,8],[3,6,9]])>>>b=np.eye(3,4,dtype=int)>>>barray([[1,0,0,0],[0,1,0,0],[0,0,1,0]])>>>b.Tarray([[1,0,0],[0,1,0],[0,0,1],[0,0,0]])>>>b.reshape(4,3)array([[1,0,0],[0,0,1],[0,0,0],[0,1,0]])11.1.3數組與數組的運算
秩為2數組的轉置變換212025/3/6>>>b.swapaxes(0,1)array([[1,0,0],[0,1,0],[0,0,1],[0,0,0]])>>>c=np.arange(16).reshape(2,2,4)>>>carray([[[0,1,2,3],[4,5,6,7]],[[8,9,10,11],[12,13,14,15]]])>>>c.Tarray([[[0,8],[4,12]],[[1,9],[5,13]],[[2,10],[6,14]],[[3,11],[7,15]]])>>>c.swapaxes(0,2)array([[[0,8],[4,12]],[[1,9],[5,13]],[[2,10],[6,14]],[[3,11],[7,15]]])
11.1.3數組與數組的運算
數組與矩陣的點積222025/3/6>>>a=np.array([[1,2],[3,4]])>>>b=np.array([[5,6],[7,8]])>>>aarray([[1,2],[3,4]])>>>barray([[5,6],[7,8]])>>>a*barray([[5,12],[21,32]])>>>a.dot(b)array([[19,22],[43,50]])>>>np.dot(a,b)array([[19,22],[43,50]])>>>np.dot(b,a)array([[23,34],[31,46]])>>>c=np.matrix(a)>>>d=np.matrix(b)>>>cmatrix([[1,2],[3,4]])>>>dmatrix([[5,6],[7,8]])>>>c*dmatrix([[19,22],[43,50]])>>>d*cmatrix([[23,34],[31,46]])>>>a**2 array([[1,4],[9,16]],dtype=int32)11.1.3數組與數組的運算
數組的廣播機制
NumPy采取一種稱為廣播(Broadcasting)的機制,可以使得秩較小的數組進行擴展。
如果兩個數組在某一軸上的長度是相同的,或者其中一個數組在該軸上的長度為1,則這兩個數組在該軸上是相容的。
進行廣播時,擁有較小秩的數組可以通過廣播將相容的軸上的數據沿其它軸復制,以擴充為與擁有較大秩的數組相同的形狀。232025/3/611.1.3數組與數組的運算 a、b兩個數組在所有軸上都相容,可以利用廣播機制進行算術運算。242025/3/6>>>a=np.array([[1,2,3],[4,5,6]])>>>aarray([[1,2,3],[4,5,6]])>>>b=np.full(3,0.5)>>>barray([0.5,0.5,0.5])>>>a+barray([[1.5,2.5,3.5],[4.5,5.5,6.5]])>>>a-barray([[0.5,1.5,2.5],[3.5,4.5,5.5]])>>>a*barray([[0.5,1.,1.5],[2.,2.5,3.]])>>>a/barray([[2.,4.,6.],[8.,10.,12.]])
11.1.3數組與數組的運算 a、b兩個數組在所有軸上都相容,可以利用廣播機制進行算術運算。252025/3/6>>>a=np.array([[1,2,3],[4,5,6]])>>>aarray([[1,2,3],[4,5,6]])>>>b=np.full(3,0.5)>>>barray([0.5,0.5,0.5])>>>a+barray([[1.5,2.5,3.5],[4.5,5.5,6.5]])>>>a-barray([[0.5,1.5,2.5],[3.5,4.5,5.5]])>>>a*barray([[0.5,1.,1.5],[2.,2.5,3.]])>>>a/barray([[2.,4.,6.],[8.,10.,12.]])
11.1.4數組的切片與索引
切片視圖序列結構中的切片操作同樣適用于數組。NumPy在進行切片時,不會復制數組內部數據,而是創建原數據的視圖,以引用的方式訪問數據。若要獲取某一軸的完整切片,可以在該軸上使用“:”或“…”。當切片的數量少于數組軸的數量時,缺少的維度索引被認為是一個完整切片,相當于省略了“:”或“…”。262025/3/611.1.4數組的切片與索引
272025/3/6>>>importnumpyasnp>>>a=np.linspace(0,30,num=6)>>>aarray([0.,6.,12.,18.,24.,30.])>>>a[1:6:2]array([6.,18.,30.])>>>a[3:]array([18.,24.,30.])>>>a[:3]array([0.,6.,12.])>>>a=np.arange(9)+1>>>aarray([1,2,3,4,5,6,7,8,9])>>>a.reshape(-1,3)array([[1,2,3],[4,5,6],[7,8,9]])>>>a[1:]array([2,3,4,5,6,7,8,9])>>>b=a.reshape(-1,3)>>>barray([[1,2,3],[4,5,6],[7,8,9]])>>>b[1:]array([[4,5,6],[7,8,9]])11.1.4數組的切片與索引
索引整數索引一般情況下,數組的索引會采用整數。通過數組的索引方式,將返回數組內元素的副本,而不是創建視圖。因此,相比于切片視圖,索引數據的方式更具有通用性。以數組作為索引以整數作為索引可以返回數組的元素,可能會對應一個子數組或數值。如果以數組作為索引,相當于多個整數索引結果的集合。也可以直接采用列表進行索引操作,其效果與數組作為索引的效果相同。布爾索引一般的數組索引默認為整數索引,如果索引本身為布爾類型,則為數組的布爾索引。布爾數組用途十分廣泛,如元素篩選、元素賦值。282025/3/611.1.4數組的切片與索引
292025/3/6>>>a=np.logspace(0,100,10).reshape(5,2)>>>aarray([[1.00000000e+000,1.29154967e+011],[1.66810054e+022,2.15443469e+033],[2.78255940e+044,3.59381366e+055],[4.64158883e+066,5.99484250e+077],[7.74263683e+088,1.00000000e+100]])>>>a[2]array([2.78255940e+44,3.59381366e+55])>>>a=np.identity(4)>>>aarray([[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]])>>>i=np.fromstring('0,1,2',dtype=int,sep=',')>>>iarray([0,1,2])>>>a[i]array([[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.]])>>>a[0,i]array([1.,0.,0.])>>>a=np.arange(8)>>>a>4array([False,False,False,False,False,True,True,True])>>>a[a>4]array([5,6,7])11.1.5數組的函數運算
采用NumPy數組以后,數組的函數運算可以直接對數組中所有元素進行操作,而不必每次都利用程序對每個元素進行計算,往往具有更好的程序可讀性和更快的運行效率302025/3/611.1.5數組的函數運算
條件與分段函數NumPy中條件與分段的函數312025/3/6NumPy函數說明select(condlist,choicelist,default=0)條件列表condlist與選擇列表choicelist的長度相對應where(condition)常被用作條件索引,返回符合條件元素位置的元組where(condition,x,y)條件取值,為True時取值為x,為False時取值為ypiecewise(x,condlist,funclist)分段函數,條件列表condlist與函數列表funclist的長度相對應11.1.5數組的函數運算
322025/3/6>>>importnumpyasnp>>>a=np.arange(10)>>>aarray([0,1,2,3,4,5,6,7,8,9])>>>b=np.select([a<6],[a+10],default=20)>>>barray([10,11,12,13,14,15,20,20,20,20])>>>c=np.arange(6).reshape(2,3)>>>carray([[0,1,2],[3,4,5]])>>>np.where(c>2)(array([1,1,1],dtype=int64),array([0,1,2],dtype=int64))>>>c[np.where(c>2)] #條件索引array([3,4,5])>>>np.where(b>2,1,-1) array([[-1,-1,-1],[1,1,1]])>>>d=np.piecewise(c,[c<2,c>4],[-1,1])>>>darray([[-1,-1,0],[0,0,1]])11.1.5數組的函數運算332025/3/6>>>a=np.fromiter((x*xforxinrange(10)),int)>>>aarray([0,1,4,9,16,25,36,49,64,81])>>>b=np.piecewise(a,[a<10,a>30],[-1,1])>>>barray([-1,-1,-1,-1,0,0,1,1,1,1])>>>c=np.piecewise(a,[a<10,a>30],[lambdax:x+100,lambdax:x*10])>>>carray([100,101,104,109,0,0,360,490,640,810])11.1.5數組的函數運算
通用函數
NumPy中的通用函數(universalfunction)是能同時對數組中的所有元素進行運算的函數。NumPy中常用的通用函數(部分)342025/3/6NumPy函數說明abs(a)取各元素的絕對值
sqrt(a)計算各元素的平方根square(a)計算各元素的平方log(a),log10(a),log2(a)計算各元素的自然對數、10、2為底的對數ceil(a),floor(a)計算各元素的ceiling值(向上取整),floor值(向下取整)rint(a)各元素四舍五入modf(a)將數組各元素的小數和整數部分以兩個獨立數組形式返回11.1.5數組的函數運算bincount()函數用于統計數組元素的數量,其bin的數量為數組中最大值元素n再加1。然后在其中的每個bin內填充該bin索引數所對應的數組元素的數量。如以下所示,其中x的最大元素為10,因此所建立的bin為0..10共11個,由于0的數量為1,所以第0個位置為1,1的數量為3,因此第1個位置的值為3,依此類推。
>>>x=np.array([0,1,1,3,2,1,10]) >>>y=np.bincount(x) >>>y array([1,3,1,1,0,0,0,0,0,0,1],dtype=int64)352025/3/611.1.5數組的函數運算
在通用函數中,很多函數的輸入參數中有軸,默認為None。以unique()函數為例,當axis=None時,不考慮軸,則數組中的所有元素都考慮進來。如果考慮了軸,則僅在指定軸上尋找唯一的元素,如下例所示。
>>>a=np.array([[1,0,0],[1,0,0],[2,3,4]]) >>>np.unique(a) array([0,1,2,3,4]) >>>np.unique(a,axis=0) #第0軸上有3個元素,即3個列表 array([[1,0,0], [2,3,4]])362025/3/611.1.5數組的函數運算
當不包含axis參數時,默認為None,此時表示所有數組元素的和。>>>a=np.arange(18).reshape((2,3,3))>>>aarray([[[0,1,2],[3,4,5],[6,7,8]],[[9,10,11],[12,13,14],[15,16,17]]])>>>np.sum(a)153372025/3/6
axis=0,第0軸上有兩個元素>>>a=np.arange(18).reshape((2,3,3))>>>np.sum(a,axis=0)array([[9,11,13],[15,17,19],[21,23,25]])11.1.5數組的函數運算
對于axis=1,數組a第1軸上分成兩個部分,每個部分有3個元素>>>np.sum(a,axis=1)array([[9,12,15],[36,39,42]])382025/3/6
對于axis=2,數組a第2軸上進行求值>>>np.sum(a,axis=2)array([[3,12,21],[30,39,48]])11.2科學計算
SciPy
是一個用于數學、科學、工程領域的常用軟件包,可以處理插值、積分、優化、圖像處理、常微分方程數值解的求解、信號處理等問題。SciPy的主要模塊392025/3/6模塊說明cluster向量計算/Kmeansconstants物理和數學常量fftpack傅立葉變換integrate積分程序interpolate插值io數據輸入輸出linalg線性代數程序模塊說明ndimagen維圖像包odr正交距離回歸optimize優化signal信號處理sparse稀疏矩陣spatial稀疏矩陣special一些特殊的數學函數stats統計11.2科學計算SciPy科學計算庫
在NumPy庫的基礎上增加了眾多的數學、科學以及工程計算中常用的庫函數。例如線性代數、常微分方程數值求解、信號處理、圖像處理、稀疏矩陣等等。可以進行插值處理、信號濾波以及用C語言加速計算。402025/3/6【例11-1】計算定積分412025/3/6
importnumpyasnp fromscipyimportintegrate f=lambdax:np.exp(-x) x=integrate.quad(f,0,np.inf) print(x) print('Theintegrateis%.1f'%x[0])程序執行情況如下:(1.0000000000000002,5.842606703608969e-11)Theintegrateis1.0SciPy的積分模塊給出了積分函數:
egrate.quad(func,a,b)
其中func為定積分的函數,a為積分下限,b為積分上限。其返回值
為一個元組(y,abserr),其中y為積分結果,abserr為對結果y絕對誤差的估計。11.2科學計算
SciPy中的linalg提供了更多的線性代數計算功能,在NumPy中也有linalg模塊,二者在一些函數實現方面相同。在例11-2中給出了求逆矩陣的一個示例,在此例中分別使用了SciPy和NumPy中的linalg模塊,可以看到相同的計算結果。linalg模塊進行逆矩陣求解所用的函數為:
linalg.inv(a,overwrite_a=False,check_finite=True)
422025/3/6【例11-2】求矩陣的逆矩陣importnumpyasnpfromscipyimportlinalgx=np.array([[1.,2.],[3.,4.]])y=linalg.inv(x)print(y)print(np.dot(x,y))print(np.rint(np.dot(x,y)))z=np.linalg.inv(x)#采用NumPy的linalg線性代數包print(z)print(np.rint(np.dot(x,z)))a=np.matrix(x)b=linalg.inv(a)print(b)print(np.rint(np.dot(a,b)))432025/3/6程序執行情況如下:[[-2.1.][1.5-0.5]][[1.0000000e+000.0000000e+00][8.8817842e-161.0000000e+00]][[1.0.][0.1.]][[-2.1.][1.5-0.5]][[1.0.][0.1.]][[-2.1.][1.5-0.5]][[1.0.][0.1.]]【例11-3】求解非齊次線性方程組
對非齊次線性方程組的求解,linalg提供了solve(A,b)方法,對應著Ax=b的非齊次方程的系數。
importnumpyasnp fromscipyimportlinalg A=np.array([[4,-2,2],[1,2,-4],[2,-5,4]]) b=np.array([1,2,4]) x=linalg.solve(A,b)442025/3/6程序執行結果如下:[0.-2.-1.5]11.2科學計算
對于非線性方程組,SciPy的optimize庫的fsolve函數可以提供求解方法。其基本使用方法為fsolve(func,x0),其中func(x)函數用于計算方程組的誤差,參數x是一個矢量,表示方程組的各個未知數的一組可能解,x0為未知數矢量的初始值。解以下方程組:
則func可以定義如下:
deffunc(x): x1,x2,x3=x return[f1(x1,x2,x3),f2(x1,x2,x3),f3(x1,x2,x3)452025/3/611.2科學計算SciPy的signal模塊提供了很多信號處理的功能,在此介紹一下其中的中值濾波的方法。中值濾波是數字信號處理、數字圖像處理中常用的預處理技術,特點是將信號中的每個值都替換為其領域內的中值,即領域內所有值排序后中間位置的值。
signal的medfilt()提供了中值濾波的功能,用法如下:
scipy.signal.medfilt(a,kernel_size=None)a為輸入的數組,kernel_size為中值計算的鄰域,必須為奇數,可以是數字或元組。每個位置的鄰域中選取中間的數值作為結果中對應位置的值,對于鄰域中沒有元素的位置,以0補齊。462025/3/6【例11-4】求解非線性方程組fromscipy.optimizeimportfsolvefrommathimportsin,cosdeff(x):x0,x1,x2=float(x[0]),float(x[1]),float(x[2])return[5*x1+3,4*x0*x0-2*sin(x1*x2),x1*x2-1.5]x0,x1,x2=fsolve(f,[1,1,1])print(x0,x1,x2)print(f([x0,x1,x2]))472025/3/6程序執行結果如下:-0.7062205698661039-0.6-2.500000000000009[0.0,-9.126033262418787e-14,5.329070518200751e-15]【例11-5】一維數組的中值濾波
importnumpyasnp importscipy.signalassignal
x=np.arange(0,100,10) np.random.shuffle(x) print(x) y=signal.medfilt(x,3) print(y)482025/3/6程序執行結果如下:[3007060905020401080][0.30.60.70.60.50.40.20.40.10.]【例11-6】二維數組的3×3窗口中值濾波
importnumpyasnp importscipy.signalassignal x=np.random.randint(1,1000,(4,4)) print(x) y=signal.medfilt(x,(3,3)) print(y)492025/3/6程序執行結果如下:
[[4578661907] [[0.412.456.0.][661994412456] [559.578.578.456.][559574736562] [120.559.456.364.][1204332364]] [0.120.332.0.]]11.2科學計算
二維數組進行3×3窗口中值濾波時,第一組得到0,第二組得到412,對其余元素繼續重復此過程即得到濾波結果的矩陣。
若要進行5×5窗口的中值濾波,則每次要構建5×5的矩陣。502025/3/611.3數據圖表512025/3/6Matplotlib模塊依賴于numpy模塊和tkinter模塊,可以繪制多種形式的圖形
Matplotlib提供了強大的繪圖功能,pyplot將numpy作為獨立模塊導入,符合一般的編程習慣【例11-7】在pyplot繪圖中顯示中文
importnumpyasnp frommatplotlibimportpyplotasplt frommatplotlibimportfont_manager font=font_manager.FontProperties(fname=r"C:\Windows\Fonts\msyh.ttf") x=np.arange(1,11) y=2*x+5 plt.title("Matplotlib繪圖",fontproperties=font,fontsize=13) plt.xlabel("x軸",fontproperties=font,fontsize=12) plt.ylabel("y軸",fontproperties=font,fontsize=12) plt.plot(x,y) plt.show()522025/3/6【例11-8】一個具有自定義坐標范圍的繪圖
importnumpyasnp frommatplotlibimportpyplotasplt fig=plt.figure() ax=fig.add_subplot(111) ax.set(xlim=[0.5,4.5],ylim=[-2,8],title='AnExampleAxes',ylabel='Y-axis',xlabel='X-axis’) ax.plot([1,2,3],[1,2,3]) plt.show()532025/3/611.3.2線形圖線形圖主要是依靠其表現的曲線形狀來展現出數據的特性。plot()方法提供了線形圖的繪制能力,具體用法為: pyplot.plot([x],y,'[marker][line][color]',*,data=None,**kwargs)
其中marker為線圖上離散點的標記,line為線形,color為線圖的顏色,data為自定義的數據對象。其取值如表11-6、11-7、11-8所示。如'gH--'表示綠色線條,點的樣式為六邊形,線的樣式為短橫線所畫出來的曲線。542025/3/611.3.2線形圖552025/3/6字符描述'-'實線樣式'--'短橫線樣式'-.'點劃線樣式':'虛線樣式pyplot.plot中的線形字符描述'b'藍色'g'綠色'r'紅色'c'青色'm'品紅色'y'黃色'k'黑色'w'白色pyplot.plot中的顏色【例11-9】利用線形圖繪制三角函數importnumpyasnpfrommatplotlibimportpyplotaspltfig=plt.figure()ax1=fig.add_subplot(221)ax2=fig.add_subplot(222)ax3=fig.add_subplot(223)ax4=fig.add_subplot(224)x=np.linspace(0,np.pi)y_sin=np.sin(x)y_cos=np.cos(x)y_tan=np.tan(x)ax1.plot(x,y_sin)ax2.plot(x,y_sin,'gH--', linewidth=1,markersize=4)ax3.plot(x,y_cos,color='red', marker='+',linestyle='dashed')ax4.plot(x,y_tan,'bv:', linewidth=1,markersize=4)plt.show()562025/3/611.3.3散點圖有時候數據點之間的關系未必呈現線性關系,有時需要查看數據點在空間中的分布情況,此時散點圖是一種很好的選擇。散點圖的具體用法如下:
pyplot.scatter(x,y,s=None,c=None,marker=None,norm=None, vmin=None,vmax=None,alpha=None,linewidths=None, verts=None,edgecolors=None,hold=None,data=None, **kwargs)
其中x、y為長度一致的數據,s為標記大小,可以為標量或通過列表為每個x、y標記大小單獨賦值,若為空列表[]則默認為36平方磅。c(color)為顏色,marker為標記樣式,edgecolors為輪廓顏色,alpha為透明度,linewidths為線寬。572025/3/611.3.3散點圖繪圖時,可以用圖例的方法在繪圖中展示出每套散點的標簽參數值(label)。圖例的用法如下:
pyplot.legend(loc='upperright',
**kwargs)圖例的位置參數(loc)表示圖例在繪圖上的方位,具體取值范圍如表所示。若選取loc='best'或loc=0,表示由系統自行選擇合適的位置。
圖例的位置取值582025/3/6模塊說明0'best'1'upperright'2'upperleft'3'lowerleft'4'lowerright'5'right'6'centerleft'7'centerright'8'lowercenter'9'uppercenter'10'center'【例11-10】一個散點圖的示例importmatplotlib.pyplotaspltimportnumpyasnpx1=[1,2,3,4]y1=[1,2,3,4]x2=[1,2,3,4]y2=[2,3,4,5]
n=10x3=np.random.randint(0,5,n)y3=np.random.randint(0,5,n) plt.scatter(x1,y1,marker='x',color='red',s=40,label='散點1')plt.scatter(x2,y2,marker='s',color='blue',s=60,label='散點2')plt.scatter(x3,y3,marker='o',color='green',s=50,label='散點3')plt.legend(loc='best') plt.show()592025/3/611.3.4條形圖
條形圖(又稱柱狀圖)能夠直觀表現數據量及其增長變化關系,常常用于表現各類經濟或統計領域的分類數據。
柱狀圖的用法如下: pyplot.bar(x,height,width=0.8,bottom=None,*,align='center’, data=None,**kwargs)
其中x為標量序列,表示x軸的刻度數據,height為y軸的刻度,width為單個柱圖的寬度,bottom為y邊界坐標軸起點。602025/3/611.3.4條形圖缺省情況下的柱狀圖為豎直繪制的,只需設置x和y的坐標,如:
plt.bar(x=index,height=y1)若要水平繪制,可采用坐標變換的方式,并設置orientation為'horizontal',如下所示: plt.bar(x=0,bottom=index1,width=y2,height=bar_height,color='b’, orientation='horizontal')
其中柱圖的x從0開始,bottom對應原有x坐標的刻度,width對應原有y坐標的刻度。對于橫向的堆疊柱圖(如下圖上右側),只需在完成一次繪制之后,再次進行一次柱圖的繪制,且其x不再從0開始,而是從第一次繪制時截止的width值開始,即:
plt.bar(x=y2,bottom=index1,width=y3,height=bar_height,color='r’, orientation='horizontal’)612025/3/6【例11-11】一個條形圖的示例importmatplotlib.pyplotaspltimportnumpyasnpy1=[20,30,10,25,15]y2=[35,25,55,15]y3=[15,35,25,45]index=np.arange(len(y1))index1=np.arange(4)bar_height=0.5bar_width=0.3plt.subplot(221)plt.bar(x=index,height=y1)plt.subplot(222)plt.bar(x=0,bottom=index1,width=y2,height=bar_height,color='b',orientation='horizontal')plt.bar(x=y2,bottom=index1,width=y3,height=bar_height,color='r',orientation='horizontal')plt.subplot(212)index=np.arange(4)plt.bar(x=index,height=y2,width=bar_width,color='b')plt.bar(x=index+bar_width,height=y3,width=bar_width,color='r')plt.show()622025/3/611.3.5直方圖直方圖是一種頻次統計報告圖,第i個長條形的高度表示該區間事件發生的數量ni,其寬度表示該區間大小,其區間的范圍則是發生這些事件的條件。若直方圖各個區間寬度相同,則區間面積與總面積的比值為該區間事件發生的頻次。以下為直方圖的用法:
pyplot.hist(x,bins=None,range=None,density=False, bottom=None, histtype='bar',align='mid',log=False,color=None, label=None, stacked=False,normed=None)其中x為數據集,bins為區間的數量,為標量時表示等分數量,為列表時則可以詳細劃分每個區間,density為False表示顯示頻數統計結果,為True則表示頻率統計,histtype可選區間為{'bar','barstacked','step','stepfilled'},align可選{'left','mid','right'}之一,stacked表示是否為堆積狀圖。Matplotlib自帶了TeX表達式解析器,可以對復雜的數學符號進行編輯,并將其顯示在繪制的圖像上。一般需要在字符串前添加r作為前綴,并用美元符號($)包圍數學符號,632025/3/6如r'$\mu_1=90$'表示
【例11-12】直方圖示例程序importmatplotlib.pyplotaspltimportnumpyasnpplt.subplot(211)salary=[2400,2700,3100,5600,8000,8900,9200,9800,10000,10100,10300]salary.sort()thebins=[1000,2000,3000,4000,7000,8000,9000,10000,11000]res=plt.hist(salary,thebins,histtype='bar',rwidth=0.8)plt.ylabel('Count')plt.subplot(212) np.random.seed(4) Gaussian=np.random.normal(0,1,1000) plt.hist(Gaussian,bins=25,histtype="stepfilled",density=True,alpha=0.6)plt.ylabel('Density')plt.show()642025/3/6【例11-13】多個正態分布的直方圖importnumpyasnpimportmatplotlib.pyplotaspltmu1,sigma1=90,15mu2,sigma2=50,6x1=mu1+sigma1*np.random.randn(10000)x2=mu2+sigma2*np.random.randn(10000)fig=plt.figure()ax=fig.add_subplot(1,1,1)ax.hist(x1,bins=50,density=True,color='red')ax.hist(x2,bins=50,density=True,color='blue')ax.set_title(r'$\mu_1=90,\\sigma_1=15,\\mu_2=50,\\sigma_2=6$')ax.set_xlabel('x')ax.set_ylabel('freq')ax.set_ylim(0,0.1)plt.grid(True) fig.show()652025/3/611.3.6餅圖餅圖用于顯示一個數據序列中各項的大小與各項總和的比例,是一種比較直觀的數據可視化形式。常用參數如下:
pyplot.pie(x,explode=None,labels=None,colors=None, shadow=False, labeldistance=1.1,startangle=None,radius=None, counterclock=True, center=(0,0),frame=False,rotatelabels=False)其中x為各扇區的比例,如果sum(x)>1會使用sum(x)歸一化,labels為餅圖外側顯示的說明文字,explode為各扇區離開中心的距離。如果要在當前圖示中更加靈活地添加一個小圖,可以采用添加坐標系(axes)的方式,每個坐標系則對應了一個獨立的繪圖,例如:
fig.add_axes([left,bottom,width,height])則添加了一個左下角坐標為(left,bottom),長寬為width和height的可繪圖坐標系。在例11-14中,在餅圖下方嵌套了一個小圖,圖中采用xticks()方法設置了自定義的坐標軸刻度,以年份為x軸坐標。662025/3/6【例11-14】某企業營銷數據的餅圖示例importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']#設置中文字體plt.rcParams['axes.unicode_minus']=Falsedata={'廣州':(35,'r'),'上海':(45,'b'),'北京':(60,'m'),'其它':(80,'#923f40'),}fig=plt.figure(figsize=(5,5))cities=data.keys()values=[x[0]forxindata.values()]colors=[x[1]forxindata.values()]672025/3/6【例11-14】某企業營銷數據的餅圖示例ax1=fig.add_subplot(111)ax1.set_title('營銷數據(萬元)')labels=['{}:{}'.format(city,value)forcity, valueinzip(cities,values)]explode=[0,0,0.1,0]ax1.pie(values,labels=labels,colors=colors, explode=explode,shadow=True)left,bottom,width,height=[0.06,0.06,0.2,0.2]ax2=fig.add_axes([left,bottom,width,height])x=np.linspace(0,10,3)y=[175,185,220]group_labels=['2017','2018','2019']plt.xticks(x,group_labels,rotation=0)ax2.plot(x,y)plt.show()682025/3/611.4數據分析692025/3/6pandas(PythonDataAnalysisLibrary)是基于NumPy的數據分析模塊,提供了高效操作大型數據集所需的工具。為增強數據處理能力,pandas為數據建立了索引機制,來實現對每個數據的標簽化。11.4.1標簽化的一維數組一般來說,數組、元組數據可以采用數據順序存放的位置編號(整數)作為索引。字典不屬于順序存放的數據,但字典可以利用鍵值(一般為整數、字符串)作為索引。在很多場合中,這種鍵值索引的方式更容易滿足應用的需求,對數據的表達更加直觀,有利于數據的處理。如果能夠對一般的序列結構數據也能夠像字典一樣通過有意義的鍵值作為標簽,就能夠加強數據的表現效果并提高其操作處理能力。702025/3/611.4.1標簽化的一維數組Series對象
pandas的Series數據類型就提供了這樣的一種帶標簽的一維數組形式。默認情況下,Series對象為每個數據設置如同元組和列表一樣的位置索引。Series采用數組的形式保存數據,其輸入也可以是數組、字典,并可以在構造函數中直接指定定制索引。712025/3/611.4.1標簽化的一維數組722025/3/6>>>importnumpyasnp 0[1,2,3]>>>importpandasaspd 1[4,5,6]>>>s1=pd.Series((1,2,3)) dtype:object>>>s1 >>>s3=pd.Series(['a','b','c‘])01 >>>s312 0a23 1bdtype:int64 2c>>>s2=pd.Series([[1,2,3],[4,5,6]]) dtype:object>>>s211.4.1標簽化的一維數組732025/3/6>>>s4=pd.Series({'a':1,'b':2,'c':3}) 33>>>s4 dtype:int32a1 >>>s6=pd.Series([1,2,3,4],index=['A','B',b2 'C','D'])c3 >>>s6dtype:int64 A1>>>s5=pd.Series(np.arange(4)) B2>>>s5 C300 D411 dtype:int642211.4.1標簽化的一維數組
數據的選擇、添加和刪除
完成Series數組的創建后,可以隨時修改其索引的標簽,也可以通過索引訪問和修改其數值。
Series數組可以進行數據的添加和刪除操作,添加元素時采用append()方法連接其它Series,刪除元素時可以通過drop()方法刪除指定索引的值,但這些操作并不影響數組本身,因此若要實現對數組元素的添加和刪除,還需要在操作完成后重新對變量進行賦值。742025/3/6>>>s5.index=['red','green','blue','yellow’] dtype:int32>>>s5 >>>s5['green']=4red0 >>>foriins5.index:green1 print(i,s5[i])blue2 red0yellow3 green1blue2 yellow311.4.1標簽化的一維數組752025/3/6>>>s5.drop('green’) red0red0 blue2blue2 yellow3yellow3 dtype:int32 dtype:int32 >>>s7=s5.append(s4)>>>s5 #可見s5并未改變 >>>s7red0 red0green4 blue2blue2 yellow3yellow3 a1dtype:int32 b2 >>>s5=s5.drop('green’) c3>>>s5 dtype:int6411.4.1標簽化的一維數組四則運算創建完成后,可以像使用普通數組一樣對Series數組進行條件或四則運算,運算時是以當前的索引標簽作為兩個Series
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 共享自習室項目實施方案
- 貴州省六盤水市水城區2023-2024學年高一上學期12月月考歷史含解析
- 2025年開展安全生產月活動實施方案 (3份)
- 江西工業貿易職業技術學院《納米材料表征方法》2023-2024學年第二學期期末試卷
- 廣西英華國際職業學院《籃球四》2023-2024學年第二學期期末試卷
- 安徽理工大學《電工電子綜合實踐》2023-2024學年第二學期期末試卷
- 濮陽石油化工職業技術學院《工業催化》2023-2024學年第二學期期末試卷
- 甘肅機電職業技術學院《計算機應用綜合性設計》2023-2024學年第二學期期末試卷
- 廣東海洋大學《大數據技術開源架構》2023-2024學年第二學期期末試卷
- 武漢科技大學《環境生態學俄》2023-2024學年第二學期期末試卷
- 2025年四川省成都市錦江區中考數學二診試卷(含部分答案)
- 《新能源汽車產業鏈》課件
- 【MOOC】國際交英文寫作-湖南大學 中國大學慕課MOOC答案
- 國家八年級數學質量測試題(六套)
- 餐飲油煙污染防治承諾書
- 民法典物權編解讀課件
- GB∕T 13554-2020 高效空氣過濾器
- 2021年北京市海淀區八年級(下)期末語文試卷及答案
- 6se70手冊制動單元
- 幼兒園環境創設評分表
- 單位換算練習題 全
評論
0/150
提交評論