




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第11章科學(xué)計算與可視化學(xué)習(xí)目標(biāo)掌握數(shù)組與矩陣的運算
熟悉SciPy的科學(xué)計算
了解數(shù)據(jù)圖表的繪制
熟悉數(shù)據(jù)分析工具的使用
熟悉數(shù)據(jù)的統(tǒng)計分析22025/3/6本章簡介
科學(xué)計算是利用計算機再現(xiàn)、預(yù)測和發(fā)現(xiàn)客觀世界運動規(guī)律和演化特性的全過程,是解決科學(xué)研究和工程技術(shù)問題的基本方法。
Python提供了豐富的科學(xué)計算與可視化技術(shù)的功能模塊,本章側(cè)重于選取其中的基礎(chǔ)方法和工具
本章使用的各類軟件包可以在命令行窗口一次性安裝:
pipinstallnumpyscipymatplotlibpandasstatistics32025/3/611.1數(shù)組與矩陣運算42025/3/6列表、數(shù)組和矩陣數(shù)組與標(biāo)量的算術(shù)運算數(shù)組與數(shù)組的運算數(shù)組的切片與索引數(shù)組的函數(shù)運算11.1.1列表、數(shù)組和矩陣52025/3/6列表
列表和元組是Python的常見序列類型,例如:
一維數(shù)組 list1=[1,2,3,'a’]
二維數(shù)組 tuple1=([1,2,3],[4,5,6],[7,8,9])
由于列表中的數(shù)據(jù)類型可以不同,對于列表自身的操作主要是以元素的添加和刪除為主,如append()方法可以添加元素,列表還支持加法+和乘法*的方式來添加元素。 >>>list1+[1,2] >>>list1*2 [1,2,3,'a',1,2] [1,2,3,'a',1,2,3,'a’]因此列表并不能提供數(shù)學(xué)意義上的數(shù)組元素之間的四則運算。11.1.1列表、數(shù)組和矩陣62025/3/6數(shù)組 NumPy模塊中提供了真正的數(shù)組實現(xiàn),稱為多維數(shù)組對象,即ndarray(n-dimensionalarray)。ndarray會將所有元素轉(zhuǎn)化為同一種類型,該對象可以接收各類序列類型的數(shù)據(jù),并將其轉(zhuǎn)化為數(shù)組。
①ndarray數(shù)組中的維度(dimensions)又稱為軸(axis)。
②ndarray數(shù)組的維數(shù)又稱為秩(rank),一維數(shù)組的秩
為1,二維數(shù)組的秩為2,依此類推,因此秩的數(shù)量
也就是軸的個數(shù)。要創(chuàng)建ndarray數(shù)組,采用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列表、數(shù)組和矩陣72025/3/6#array([1,2,3,4])#array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])ndarray數(shù)組對象的基本屬性11.1.1列表、數(shù)組和矩陣82025/3/6屬性說明.ndim數(shù)組的秩,即軸的數(shù)量或維度的數(shù)量.shape數(shù)組的維度,表示數(shù)組在每個維度上的元素個數(shù),例如二維數(shù)組中緯度即表示行數(shù)和列數(shù).size數(shù)組元素總個數(shù),為shape屬性中元組元素的乘積.dtype數(shù)組元素的數(shù)據(jù)類型.itemsize數(shù)組元素占用的字節(jié)數(shù).data包含數(shù)組元素的內(nèi)存區(qū)域數(shù)組的第0軸對應(yīng)著第一維,第1軸對應(yīng)著第二維,數(shù)組的秩為2,維度為(3,4)的形狀,元素總個數(shù)為12。>>>a2.ndim2>>>a2.shape(3,4)>>>a2.size12>>>a2.dtypedtype('int32')>>>a2.itemsize4>>>a2.data<memoryat0x00000235D2472048>11.1.1列表、數(shù)組和矩陣92025/3/64×3數(shù)組的兩個軸NumPy支持的數(shù)據(jù)類型11.1.1列表、數(shù)組和矩陣102025/3/6類型類型代碼說明int8、uint8i1、u1有符號和無符號的8位(1個字節(jié))整型int16、uint16i2、u2有符號和無符號的16位(2個字節(jié))整型int32、uint32i4、u4有符號和無符號的32位(4個字節(jié))整型int64、uint64i8、u8有符號和無符號的64位(8個字節(jié))整型float16f2半精度浮點數(shù),16位float32f4或f標(biāo)準(zhǔn)的單精度浮點數(shù),32位11.1.1列表、數(shù)組和矩陣112025/3/6類型類型代碼說明float64或floatf8或g標(biāo)準(zhǔn)的雙精度浮點數(shù),64位complex64c8用兩個32位浮點數(shù)表示實部和虛部complex128或complexc16用兩個64位浮點數(shù)表示實部和虛部bool?存儲True和False的值的布爾類型objectoPython對象類型strings字符串類型unicodeuunicode類型NumPy中常見的常量11.1.1列表、數(shù)組和矩陣122025/3/6常量說明inf,Inf,Infinity,infty,PINF正無窮NINF負(fù)無窮PZERO正零NZERO負(fù)零NAN,NaN,nan非數(shù)值e自然常數(shù)epiπ以下來觀察列表、數(shù)組和矩陣維度的差異。11.1.1列表、數(shù)組和矩陣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列表、數(shù)組和矩陣142025/3/6矩陣 NumPy也定義了矩陣類型(matrix),是一種2維的特殊數(shù)組,是多維數(shù)組(ndarray)的一個特例。因此,在NumPy中,矩陣被定義為數(shù)組的子類,具有很多數(shù)組的特性。np.shape()是一個可查看數(shù)組維度的函數(shù),等同于數(shù)組的shape()方法。矩陣對數(shù)據(jù)的處理與數(shù)組有細(xì)微的差別,數(shù)組中允許單維度的數(shù)據(jù),而矩陣中所有的數(shù)據(jù)均被處理為雙維度,當(dāng)輸入為列表數(shù)據(jù)是,其處理方式是行數(shù)為1,列數(shù)為列表元素個數(shù)的矩陣。11.1.2數(shù)組與標(biāo)量的算術(shù)運算152025/3/6算術(shù)運算NumPy數(shù)組和矩陣在算術(shù)運算中的使用與數(shù)學(xué)定義基本一致。numpy.array()方法的詳細(xì)用法: numpy.array(object,dtype=None,copy=True,order='K’, subok=False, ndmin=0)object為待轉(zhuǎn)換的數(shù)據(jù);dtype為數(shù)據(jù)類型;copy默認(rèn)為True,會復(fù)制一個單獨的對象副本;order指定陣列的內(nèi)存布局,其中C按行、F按列、A按原順序、K按元素在內(nèi)存中出現(xiàn)的順序;subok當(dāng)輸入為矩陣時有效,表示返回的數(shù)組是否為子類,默認(rèn)為False表示采用基類,即數(shù)組,若為True,則優(yōu)先選擇子類,一般為矩陣;ndmin為數(shù)組的最小維度。11.1.2數(shù)組與標(biāo)量的算術(shù)運算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.])
首先觀察加減運算,注意其數(shù)據(jù)類型的變化。11.1.2數(shù)組與標(biāo)量的算術(shù)運算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未發(fā)生改變array([1.,2.,3.,4.,5.])>>>c[0]=0>>>a #由于c未建立單獨副本,a已改變array([0,2,3,4,5])
進(jìn)行乘除的運算,利用copy參數(shù)控制是否建立數(shù)組的副本。11.1.2數(shù)組與標(biāo)量的算術(shù)運算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 #不允許子類,因此為數(shù)組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數(shù)組與數(shù)組的運算
數(shù)組之間的算術(shù)運算
數(shù)組之間進(jìn)行算術(shù)運算時,主要是對應(yīng)的元素之間直接進(jìn)行運算,因此應(yīng)保證參與運算的兩個數(shù)組維度之間有對應(yīng)性。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數(shù)組與數(shù)組的運算
數(shù)組變換
數(shù)組對象的.T屬性提供轉(zhuǎn)置的數(shù)組,維度變換可以采用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數(shù)組與數(shù)組的運算
秩為2數(shù)組的轉(zhuǎn)置變換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數(shù)組與數(shù)組的運算
數(shù)組與矩陣的點積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數(shù)組與數(shù)組的運算
數(shù)組的廣播機制
NumPy采取一種稱為廣播(Broadcasting)的機制,可以使得秩較小的數(shù)組進(jìn)行擴展。
如果兩個數(shù)組在某一軸上的長度是相同的,或者其中一個數(shù)組在該軸上的長度為1,則這兩個數(shù)組在該軸上是相容的。
進(jìn)行廣播時,擁有較小秩的數(shù)組可以通過廣播將相容的軸上的數(shù)據(jù)沿其它軸復(fù)制,以擴充為與擁有較大秩的數(shù)組相同的形狀。232025/3/611.1.3數(shù)組與數(shù)組的運算 a、b兩個數(shù)組在所有軸上都相容,可以利用廣播機制進(jìn)行算術(shù)運算。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數(shù)組與數(shù)組的運算 a、b兩個數(shù)組在所有軸上都相容,可以利用廣播機制進(jìn)行算術(shù)運算。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數(shù)組的切片與索引
切片視圖序列結(jié)構(gòu)中的切片操作同樣適用于數(shù)組。NumPy在進(jìn)行切片時,不會復(fù)制數(shù)組內(nèi)部數(shù)據(jù),而是創(chuàng)建原數(shù)據(jù)的視圖,以引用的方式訪問數(shù)據(jù)。若要獲取某一軸的完整切片,可以在該軸上使用“:”或“…”。當(dāng)切片的數(shù)量少于數(shù)組軸的數(shù)量時,缺少的維度索引被認(rèn)為是一個完整切片,相當(dāng)于省略了“:”或“…”。262025/3/611.1.4數(shù)組的切片與索引
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數(shù)組的切片與索引
索引整數(shù)索引一般情況下,數(shù)組的索引會采用整數(shù)。通過數(shù)組的索引方式,將返回數(shù)組內(nèi)元素的副本,而不是創(chuàng)建視圖。因此,相比于切片視圖,索引數(shù)據(jù)的方式更具有通用性。以數(shù)組作為索引以整數(shù)作為索引可以返回數(shù)組的元素,可能會對應(yīng)一個子數(shù)組或數(shù)值。如果以數(shù)組作為索引,相當(dāng)于多個整數(shù)索引結(jié)果的集合。也可以直接采用列表進(jìn)行索引操作,其效果與數(shù)組作為索引的效果相同。布爾索引一般的數(shù)組索引默認(rèn)為整數(shù)索引,如果索引本身為布爾類型,則為數(shù)組的布爾索引。布爾數(shù)組用途十分廣泛,如元素篩選、元素賦值。282025/3/611.1.4數(shù)組的切片與索引
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數(shù)組的函數(shù)運算
采用NumPy數(shù)組以后,數(shù)組的函數(shù)運算可以直接對數(shù)組中所有元素進(jìn)行操作,而不必每次都利用程序?qū)γ總€元素進(jìn)行計算,往往具有更好的程序可讀性和更快的運行效率302025/3/611.1.5數(shù)組的函數(shù)運算
條件與分段函數(shù)NumPy中條件與分段的函數(shù)312025/3/6NumPy函數(shù)說明select(condlist,choicelist,default=0)條件列表condlist與選擇列表choicelist的長度相對應(yīng)where(condition)常被用作條件索引,返回符合條件元素位置的元組where(condition,x,y)條件取值,為True時取值為x,為False時取值為ypiecewise(x,condlist,funclist)分段函數(shù),條件列表condlist與函數(shù)列表funclist的長度相對應(yīng)11.1.5數(shù)組的函數(shù)運算
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數(shù)組的函數(shù)運算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數(shù)組的函數(shù)運算
通用函數(shù)
NumPy中的通用函數(shù)(universalfunction)是能同時對數(shù)組中的所有元素進(jìn)行運算的函數(shù)。NumPy中常用的通用函數(shù)(部分)342025/3/6NumPy函數(shù)說明abs(a)取各元素的絕對值
sqrt(a)計算各元素的平方根square(a)計算各元素的平方log(a),log10(a),log2(a)計算各元素的自然對數(shù)、10、2為底的對數(shù)ceil(a),floor(a)計算各元素的ceiling值(向上取整),floor值(向下取整)rint(a)各元素四舍五入modf(a)將數(shù)組各元素的小數(shù)和整數(shù)部分以兩個獨立數(shù)組形式返回11.1.5數(shù)組的函數(shù)運算bincount()函數(shù)用于統(tǒng)計數(shù)組元素的數(shù)量,其bin的數(shù)量為數(shù)組中最大值元素n再加1。然后在其中的每個bin內(nèi)填充該bin索引數(shù)所對應(yīng)的數(shù)組元素的數(shù)量。如以下所示,其中x的最大元素為10,因此所建立的bin為0..10共11個,由于0的數(shù)量為1,所以第0個位置為1,1的數(shù)量為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數(shù)組的函數(shù)運算
在通用函數(shù)中,很多函數(shù)的輸入?yún)?shù)中有軸,默認(rèn)為None。以unique()函數(shù)為例,當(dāng)axis=None時,不考慮軸,則數(shù)組中的所有元素都考慮進(jìn)來。如果考慮了軸,則僅在指定軸上尋找唯一的元素,如下例所示。
>>>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數(shù)組的函數(shù)運算
當(dāng)不包含axis參數(shù)時,默認(rèn)為None,此時表示所有數(shù)組元素的和。>>>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數(shù)組的函數(shù)運算
對于axis=1,數(shù)組a第1軸上分成兩個部分,每個部分有3個元素>>>np.sum(a,axis=1)array([[9,12,15],[36,39,42]])382025/3/6
對于axis=2,數(shù)組a第2軸上進(jìn)行求值>>>np.sum(a,axis=2)array([[3,12,21],[30,39,48]])11.2科學(xué)計算
SciPy
是一個用于數(shù)學(xué)、科學(xué)、工程領(lǐng)域的常用軟件包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號處理等問題。SciPy的主要模塊392025/3/6模塊說明cluster向量計算/Kmeansconstants物理和數(shù)學(xué)常量fftpack傅立葉變換integrate積分程序interpolate插值io數(shù)據(jù)輸入輸出linalg線性代數(shù)程序模塊說明ndimagen維圖像包odr正交距離回歸optimize優(yōu)化signal信號處理sparse稀疏矩陣spatial稀疏矩陣special一些特殊的數(shù)學(xué)函數(shù)stats統(tǒng)計11.2科學(xué)計算SciPy科學(xué)計算庫
在NumPy庫的基礎(chǔ)上增加了眾多的數(shù)學(xué)、科學(xué)以及工程計算中常用的庫函數(shù)。例如線性代數(shù)、常微分方程數(shù)值求解、信號處理、圖像處理、稀疏矩陣等等??梢赃M(jìn)行插值處理、信號濾波以及用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])程序執(zhí)行情況如下:(1.0000000000000002,5.842606703608969e-11)Theintegrateis1.0SciPy的積分模塊給出了積分函數(shù):
egrate.quad(func,a,b)
其中func為定積分的函數(shù),a為積分下限,b為積分上限。其返回值
為一個元組(y,abserr),其中y為積分結(jié)果,abserr為對結(jié)果y絕對誤差的估計。11.2科學(xué)計算
SciPy中的linalg提供了更多的線性代數(shù)計算功能,在NumPy中也有l(wèi)inalg模塊,二者在一些函數(shù)實現(xiàn)方面相同。在例11-2中給出了求逆矩陣的一個示例,在此例中分別使用了SciPy和NumPy中的linalg模塊,可以看到相同的計算結(jié)果。linalg模塊進(jìn)行逆矩陣求解所用的函數(shù)為:
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線性代數(shù)包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程序執(zhí)行情況如下:[[-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)方法,對應(yīng)著Ax=b的非齊次方程的系數(shù)。
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程序執(zhí)行結(jié)果如下:[0.-2.-1.5]11.2科學(xué)計算
對于非線性方程組,SciPy的optimize庫的fsolve函數(shù)可以提供求解方法。其基本使用方法為fsolve(func,x0),其中func(x)函數(shù)用于計算方程組的誤差,參數(shù)x是一個矢量,表示方程組的各個未知數(shù)的一組可能解,x0為未知數(shù)矢量的初始值。解以下方程組:
則func可以定義如下:
deffunc(x): x1,x2,x3=x return[f1(x1,x2,x3),f2(x1,x2,x3),f3(x1,x2,x3)452025/3/611.2科學(xué)計算SciPy的signal模塊提供了很多信號處理的功能,在此介紹一下其中的中值濾波的方法。中值濾波是數(shù)字信號處理、數(shù)字圖像處理中常用的預(yù)處理技術(shù),特點是將信號中的每個值都替換為其領(lǐng)域內(nèi)的中值,即領(lǐng)域內(nèi)所有值排序后中間位置的值。
signal的medfilt()提供了中值濾波的功能,用法如下:
scipy.signal.medfilt(a,kernel_size=None)a為輸入的數(shù)組,kernel_size為中值計算的鄰域,必須為奇數(shù),可以是數(shù)字或元組。每個位置的鄰域中選取中間的數(shù)值作為結(jié)果中對應(yīng)位置的值,對于鄰域中沒有元素的位置,以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程序執(zhí)行結(jié)果如下:-0.7062205698661039-0.6-2.500000000000009[0.0,-9.126033262418787e-14,5.329070518200751e-15]【例11-5】一維數(shù)組的中值濾波
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程序執(zhí)行結(jié)果如下:[3007060905020401080][0.30.60.70.60.50.40.20.40.10.]【例11-6】二維數(shù)組的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程序執(zhí)行結(jié)果如下:
[[4578661907] [[0.412.456.0.][661994412456] [559.578.578.456.][559574736562] [120.559.456.364.][1204332364]] [0.120.332.0.]]11.2科學(xué)計算
二維數(shù)組進(jìn)行3×3窗口中值濾波時,第一組得到0,第二組得到412,對其余元素繼續(xù)重復(fù)此過程即得到濾波結(jié)果的矩陣。
若要進(jìn)行5×5窗口的中值濾波,則每次要構(gòu)建5×5的矩陣。502025/3/611.3數(shù)據(jù)圖表512025/3/6Matplotlib模塊依賴于numpy模塊和tkinter模塊,可以繪制多種形式的圖形
Matplotlib提供了強大的繪圖功能,pyplot將numpy作為獨立模塊導(dǎo)入,符合一般的編程習(xí)慣【例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】一個具有自定義坐標(biāo)范圍的繪圖
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線形圖線形圖主要是依靠其表現(xiàn)的曲線形狀來展現(xiàn)出數(shù)據(jù)的特性。plot()方法提供了線形圖的繪制能力,具體用法為: pyplot.plot([x],y,'[marker][line][color]',*,data=None,**kwargs)
其中marker為線圖上離散點的標(biāo)記,line為線形,color為線圖的顏色,data為自定義的數(shù)據(jù)對象。其取值如表11-6、11-7、11-8所示。如'gH--'表示綠色線條,點的樣式為六邊形,線的樣式為短橫線所畫出來的曲線。542025/3/611.3.2線形圖552025/3/6字符描述'-'實線樣式'--'短橫線樣式'-.'點劃線樣式':'虛線樣式pyplot.plot中的線形字符描述'b'藍(lán)色'g'綠色'r'紅色'c'青色'm'品紅色'y'黃色'k'黑色'w'白色pyplot.plot中的顏色【例11-9】利用線形圖繪制三角函數(shù)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散點圖有時候數(shù)據(jù)點之間的關(guān)系未必呈現(xiàn)線性關(guān)系,有時需要查看數(shù)據(jù)點在空間中的分布情況,此時散點圖是一種很好的選擇。散點圖的具體用法如下:
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為長度一致的數(shù)據(jù),s為標(biāo)記大小,可以為標(biāo)量或通過列表為每個x、y標(biāo)記大小單獨賦值,若為空列表[]則默認(rèn)為36平方磅。c(color)為顏色,marker為標(biāo)記樣式,edgecolors為輪廓顏色,alpha為透明度,linewidths為線寬。572025/3/611.3.3散點圖繪圖時,可以用圖例的方法在繪圖中展示出每套散點的標(biāo)簽參數(shù)值(label)。圖例的用法如下:
pyplot.legend(loc='upperright',
**kwargs)圖例的位置參數(shù)(loc)表示圖例在繪圖上的方位,具體取值范圍如表所示。若選取loc='best'或loc=0,表示由系統(tǒng)自行選擇合適的位置。
圖例的位置取值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條形圖
條形圖(又稱柱狀圖)能夠直觀表現(xiàn)數(shù)據(jù)量及其增長變化關(guān)系,常常用于表現(xiàn)各類經(jīng)濟或統(tǒng)計領(lǐng)域的分類數(shù)據(jù)。
柱狀圖的用法如下: pyplot.bar(x,height,width=0.8,bottom=None,*,align='center’, data=None,**kwargs)
其中x為標(biāo)量序列,表示x軸的刻度數(shù)據(jù),height為y軸的刻度,width為單個柱圖的寬度,bottom為y邊界坐標(biāo)軸起點。602025/3/611.3.4條形圖缺省情況下的柱狀圖為豎直繪制的,只需設(shè)置x和y的坐標(biāo),如:
plt.bar(x=index,height=y1)若要水平繪制,可采用坐標(biāo)變換的方式,并設(shè)置orientation為'horizontal',如下所示: plt.bar(x=0,bottom=index1,width=y2,height=bar_height,color='b’, orientation='horizontal')
其中柱圖的x從0開始,bottom對應(yīng)原有x坐標(biāo)的刻度,width對應(yīng)原有y坐標(biāo)的刻度。對于橫向的堆疊柱圖(如下圖上右側(cè)),只需在完成一次繪制之后,再次進(jìn)行一次柱圖的繪制,且其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直方圖直方圖是一種頻次統(tǒng)計報告圖,第i個長條形的高度表示該區(qū)間事件發(fā)生的數(shù)量ni,其寬度表示該區(qū)間大小,其區(qū)間的范圍則是發(fā)生這些事件的條件。若直方圖各個區(qū)間寬度相同,則區(qū)間面積與總面積的比值為該區(qū)間事件發(fā)生的頻次。以下為直方圖的用法:
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為數(shù)據(jù)集,bins為區(qū)間的數(shù)量,為標(biāo)量時表示等分?jǐn)?shù)量,為列表時則可以詳細(xì)劃分每個區(qū)間,density為False表示顯示頻數(shù)統(tǒng)計結(jié)果,為True則表示頻率統(tǒng)計,histtype可選區(qū)間為{'bar','barstacked','step','stepfilled'},align可選{'left','mid','right'}之一,stacked表示是否為堆積狀圖。Matplotlib自帶了TeX表達(dá)式解析器,可以對復(fù)雜的數(shù)學(xué)符號進(jìn)行編輯,并將其顯示在繪制的圖像上。一般需要在字符串前添加r作為前綴,并用美元符號($)包圍數(shù)學(xué)符號,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】多個正態(tài)分布的直方圖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餅圖餅圖用于顯示一個數(shù)據(jù)序列中各項的大小與各項總和的比例,是一種比較直觀的數(shù)據(jù)可視化形式。常用參數(shù)如下:
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為各扇區(qū)的比例,如果sum(x)>1會使用sum(x)歸一化,labels為餅圖外側(cè)顯示的說明文字,explode為各扇區(qū)離開中心的距離。如果要在當(dāng)前圖示中更加靈活地添加一個小圖,可以采用添加坐標(biāo)系(axes)的方式,每個坐標(biāo)系則對應(yīng)了一個獨立的繪圖,例如:
fig.add_axes([left,bottom,width,height])則添加了一個左下角坐標(biāo)為(left,bottom),長寬為width和height的可繪圖坐標(biāo)系。在例11-14中,在餅圖下方嵌套了一個小圖,圖中采用xticks()方法設(shè)置了自定義的坐標(biāo)軸刻度,以年份為x軸坐標(biāo)。662025/3/6【例11-14】某企業(yè)營銷數(shù)據(jù)的餅圖示例importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']#設(shè)置中文字體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】某企業(yè)營銷數(shù)據(jù)的餅圖示例ax1=fig.add_subplot(111)ax1.set_title('營銷數(shù)據(jù)(萬元)')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數(shù)據(jù)分析692025/3/6pandas(PythonDataAnalysisLibrary)是基于NumPy的數(shù)據(jù)分析模塊,提供了高效操作大型數(shù)據(jù)集所需的工具。為增強數(shù)據(jù)處理能力,pandas為數(shù)據(jù)建立了索引機制,來實現(xiàn)對每個數(shù)據(jù)的標(biāo)簽化。11.4.1標(biāo)簽化的一維數(shù)組一般來說,數(shù)組、元組數(shù)據(jù)可以采用數(shù)據(jù)順序存放的位置編號(整數(shù))作為索引。字典不屬于順序存放的數(shù)據(jù),但字典可以利用鍵值(一般為整數(shù)、字符串)作為索引。在很多場合中,這種鍵值索引的方式更容易滿足應(yīng)用的需求,對數(shù)據(jù)的表達(dá)更加直觀,有利于數(shù)據(jù)的處理。如果能夠?qū)σ话愕男蛄薪Y(jié)構(gòu)數(shù)據(jù)也能夠像字典一樣通過有意義的鍵值作為標(biāo)簽,就能夠加強數(shù)據(jù)的表現(xiàn)效果并提高其操作處理能力。702025/3/611.4.1標(biāo)簽化的一維數(shù)組Series對象
pandas的Series數(shù)據(jù)類型就提供了這樣的一種帶標(biāo)簽的一維數(shù)組形式。默認(rèn)情況下,Series對象為每個數(shù)據(jù)設(shè)置如同元組和列表一樣的位置索引。Series采用數(shù)組的形式保存數(shù)據(jù),其輸入也可以是數(shù)組、字典,并可以在構(gòu)造函數(shù)中直接指定定制索引。712025/3/611.4.1標(biāo)簽化的一維數(shù)組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標(biāo)簽化的一維數(shù)組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標(biāo)簽化的一維數(shù)組
數(shù)據(jù)的選擇、添加和刪除
完成Series數(shù)組的創(chuàng)建后,可以隨時修改其索引的標(biāo)簽,也可以通過索引訪問和修改其數(shù)值。
Series數(shù)組可以進(jìn)行數(shù)據(jù)的添加和刪除操作,添加元素時采用append()方法連接其它Series,刪除元素時可以通過drop()方法刪除指定索引的值,但這些操作并不影響數(shù)組本身,因此若要實現(xiàn)對數(shù)組元素的添加和刪除,還需要在操作完成后重新對變量進(jìn)行賦值。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標(biāo)簽化的一維數(shù)組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標(biāo)簽化的一維數(shù)組四則運算創(chuàng)建完成后,可以像使用普通數(shù)組一樣對Series數(shù)組進(jìn)行條件或四則運算,運算時是以當(dāng)前的索引標(biāo)簽作為兩個Series
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)學(xué)-福建省莆田市2025屆高中畢業(yè)班第二次教學(xué)質(zhì)量檢測試卷(莆田二檢)試題和答案
- 2025年中考道德與法治二輪復(fù)習(xí):熱點時政專題練習(xí)題(含答案)
- 2025年中考道德與法治二輪復(fù)習(xí):七~九年級高頻考點提綱
- 刀片刺網(wǎng)施工方案
- 輕鋼平頂施工方案
- 苗木養(yǎng)護施工方案
- 2025年中考物理二輪復(fù)習(xí):簡單機械、功和機械能 尖子生測試卷(含答案解析)
- 四川省金堂縣2025屆中考考前最后一卷生物試卷含解析
- 山西省朔州市朔城區(qū)重點名校2025屆中考生物模擬試卷含解析
- 別墅房建合同范例
- 十七個崗位安全操作規(guī)程手冊
- 第10課《小小繩結(jié)用處大》(課件)三年級勞動北師大版
- 初級中學(xué)語文教師資格考試學(xué)科知識與教學(xué)能力2024年下半年測試試題與參考答案
- 2024年積分制管理實施方案及細(xì)則
- 新蘇教版科學(xué)六年級上實驗報告單
- CJT 264-2018 水處理用橡膠膜微孔曝氣器
- QCT1177-2022汽車空調(diào)用冷凝器
- 第2課 走進(jìn)物聯(lián)網(wǎng) 教學(xué)課件 -初中信息技術(shù)七年級下冊浙教版2023
- 土壤侵蝕原理智慧樹知到期末考試答案章節(jié)答案2024年甘肅農(nóng)業(yè)大學(xué)
- 2024年-急診氣道管理共識課件
- 空壓機節(jié)能技術(shù)
評論
0/150
提交評論