版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第6章數(shù)據(jù)處理目錄contents數(shù)組基礎數(shù)組的操作實例:網(wǎng)約車平臺數(shù)據(jù)分析實例:股票歷史價格分析實例:摩爾定律的驗證NumPyNumPy(NumericalPython)是Python中最常見也是最基礎的科學計算第三方庫。它提供了多維數(shù)組對象以及針對數(shù)組快速操作的各類方法。由于其底層的函數(shù)主要通過C進行編寫,使得其能非常高效得執(zhí)行數(shù)值運算。NumPy通常與其他各類科學計算第三方庫同時使用,在一些應用場景下已經(jīng)可以替代商業(yè)軟件MATLAB。NumPy可以通過conda或者pip命令進行安裝,在安裝完成后,通常以如下方式進行引用:>>>importnumpyasnp需要注意的是,將導入的名稱簡寫為np是一種廣泛采用的約定,這可以方便他人輕松地理解代碼。在本章剩余內(nèi)容的代碼中,均是按上述語句引入NumPy的前提下進行編寫的。數(shù)組基礎01數(shù)組基礎數(shù)組是NumPy庫中的核心數(shù)據(jù)結(jié)構(gòu)。數(shù)組的類被稱為ndarray,是“N維數(shù)組(N-dimensionalarray)”的縮寫,它描述了相同類型的元素組成的集合,其中每一個元素在內(nèi)存中占用相同大小的內(nèi)存塊。這體現(xiàn)了與Python內(nèi)置列表的不同,由于列表中保存的是數(shù)據(jù)的指針,因此同一個列表中數(shù)據(jù)的類型是可以不同的;而在同一個ndarray中的所有元素都必須是同一類型。數(shù)組的創(chuàng)建NumPy提供array()函數(shù)來創(chuàng)建數(shù)組,其接受“array-like”的對象并將其轉(zhuǎn)換為數(shù)組形式,最常見“array-like”對象是Python的列表與元組。#報錯,需要提供單個序列對象作為參數(shù)>>>a=np.array(1,2,3)Traceback(mostrecentcalllast):...TypeError:array()takesfrom1to2positionalargumentsbut4weregiven#使用Python列表創(chuàng)建一維數(shù)組>>>a=np.array([1,2,3])>>>aarray([1,2,3])#使用列表變量創(chuàng)建一維數(shù)組>>>element=[1,2,3]>>>np.array(element)array([1,2,3])#數(shù)組的upcast>>>np.array([1,2.0,3])array([1.,2.,3.])#使用Python的range對象創(chuàng)建數(shù)組>>>np.array(range(1,4))array([1,2,3])#使用鑲嵌列表創(chuàng)建二維數(shù)組>>>np.array([[1,2],[3,4]])array([[1,2],[3,4]])#設置數(shù)組最小的維度為2>>>np.array([1,2,3],ndmin=2)array([[1,2,3]])#使用Python列表和元組創(chuàng)建二維數(shù)組>>>np.array([[1,2],[3,4],(5,6)])array([[1,2],[3,4],[5,6]])數(shù)組的創(chuàng)建除了通過序列數(shù)據(jù)創(chuàng)建數(shù)組外,NumPy還提供了arange(),linspace(),zeros(),ones(),empty()等函數(shù)。#使用arrange()函數(shù)創(chuàng)建數(shù)字序列,用法與Python內(nèi)置range()類似>>>np.arange(5,25,5)array([5,10,15,20])#arrange()函數(shù)支持浮點數(shù)參數(shù)>>>np.arange(0,1,0.3)array([0.,0.3,0.6,0.9])#使用linspace()函數(shù)創(chuàng)建從0到1之間6個數(shù)字的等差數(shù)列,默認包含終止值>>>np.linspace(0,1,6)array([0.,0.2,0.4,0.6,0.8,1.])#生成2行3列的全0數(shù)組>>>np.zeros((2,3))array([[0.,0.,0.],[0.,0.,0.]])#生成2行3列的全1數(shù)組>>>np.ones((2,3))array([[1.,1.,1.],[1.,1.,1.]])#生成2行2列的對角線單位數(shù)組,數(shù)據(jù)格式為int8>>>np.eye(2,dtype=8)array([[1,0],[0,1]],dtype=int8)#生成1行3列的數(shù)組,值為當前內(nèi)存中的值,未經(jīng)初始化>>>np.empty((1,3))array([[1.49166815e-154,1.49166815e-154,5.92878775e-323]])數(shù)組創(chuàng)建的常用函數(shù)函數(shù)描述array將array_like的對象(如列表,元組,數(shù)組等)轉(zhuǎn)換成ndarray,默認復制輸入數(shù)據(jù)asarray與array類似,但當輸入數(shù)據(jù)已經(jīng)是ndarray時,不會復制一個新的副本arange用法如內(nèi)置range函數(shù),但返回的是ndarrayonesones根據(jù)輸入的形狀和數(shù)據(jù)類型創(chuàng)建全1的ndarrayones_likeones_like返回一個與接收數(shù)組具有相同形狀和數(shù)據(jù)類型的全1的ndarrayzeroszeros根據(jù)輸入的形狀和數(shù)據(jù)類型創(chuàng)建全0的ndarrayzeros_likezeros_like返回一個與接收數(shù)組具有相同形狀和數(shù)據(jù)類型的全0的ndarrayemptyempty根據(jù)輸入的形狀和數(shù)據(jù)生成ndarray,數(shù)組的值為內(nèi)存中的值,由于不需設置數(shù)組的值,速度會快于ones和zerosempty_likeempty_like返回一個與接收數(shù)組具有相同形狀和數(shù)據(jù)類型的ndarray,數(shù)組的值為內(nèi)存中的值fullfull根據(jù)輸入的形狀,fill_value和數(shù)據(jù)類型創(chuàng)建ndarray,數(shù)組的值全為給定的的fill_valuefull_likefull_like返回一個與接收數(shù)組具有相同形狀和數(shù)據(jù)類型的全0的ndarray,數(shù)組的值全為給定的的fill_valueeye創(chuàng)建N維單位數(shù)組(對角線上的值為1,其他值為0),允許創(chuàng)建非方陣矩陣,且對角線可偏置identity創(chuàng)建N維單位數(shù)組(對角線上的值為1,其他值為0),只能創(chuàng)建方陣,且對角線不可偏置;數(shù)組的基本屬性NumPy數(shù)組ndarray有以下重要且常用的屬性:1.維數(shù)(ndarray.ndim):返回數(shù)組維度的數(shù)量(即軸的數(shù)量)。2.形狀(ndarray.shape):返回一個整數(shù)元組,表示數(shù)組每個為維度的大小。如具有n行m列的矩陣,形狀為(n,m)。3.尺寸(ndarray.size):返回數(shù)組中元素數(shù)量的總數(shù),相當于.shape中的元素的乘積。4.元素類型(ndarray.dtype):返回數(shù)組中元素的數(shù)據(jù)類型。NumPy提供了內(nèi)置的元素類型,如32,16,andnumpy.float64等。5.元素大?。╪darray.itemsize):返回數(shù)組中每個元素的大?。ㄒ宰止?jié)為單位)。數(shù)組的基本屬性#創(chuàng)建數(shù)組>>>array_example=np.array([[[0,1,2,3],...[4,5,6,7]],...[[0,1,2,3],...[4,5,6,7]],...[[0,1,2,3],...[4,5,6,7]]])#數(shù)組的維數(shù)>>>array_example.ndim3#數(shù)組的形狀>>>array_example.shape(3,2,4)#數(shù)組的尺寸>>>array_example.size24#數(shù)組的元素類型>>>array_example.dtypedtype('int32')#數(shù)組中元素大小,int64為32bit,占4字節(jié)>>>array_example.itemsize4數(shù)組的特點使用NumPy數(shù)組的主要優(yōu)點在于更有效的內(nèi)存消耗和更快的運行時間。如下實例演示了同時基于原生序列和NumPy數(shù)組進行1000個元素的平方,可以發(fā)現(xiàn)NumPy數(shù)組的運算速度是原生序列的近250倍。造成性能差異的一個很重要的原因是NumPy數(shù)組是同質(zhì)的,即數(shù)組元素都是同一種數(shù)據(jù)類型,這一限制使得NumPy可以對數(shù)學操作代理給提前優(yōu)化且編譯過的C代碼,這個過程稱為矢量化(vectorization)。使用NumPy將顯著提升進行大數(shù)據(jù)分析時的效率。因此,在基于NumPy數(shù)組運算時,應該盡可能地運用NumPy矢量化,即更多地使用NumPy的自帶函數(shù),而盡少采用for循環(huán),這不僅可以大幅度提升效率,還可以使代碼更接近數(shù)學符號,提升代碼的閱讀性。>>>L=range(1000)>>>%timeit[i**2foriinL]#在編者計算機上花費293微秒293μs±3.22μsperloop(mean±std.dev.of7runs,1000loopseach)>>>a=np.arange(1000)>>>%timeita**2#在編者計算機上花費1.17微秒1.17μs±10.6nsperloop(mean±std.dev.of7runs,1000000loopseach)數(shù)組的操作02基礎索引基礎索引即使用下標來進行元素的訪問。在數(shù)組只有一個維度的情況下,其使用方法與Python序列的索引完全相同,即索引從0開始,同時也支持負數(shù)下標索引。#創(chuàng)建一維數(shù)組>>>a=np.arange(6)>>>aarray([0,1,2,3,4,5])#正向索引。從0開始>>>a[3]3#反向索引,從-1開始>>a[-2]4基礎索引在二維平面中描述高維數(shù)組比較困難,考慮數(shù)組形狀的一種直觀的方法就是在維度方向從左到右進行讀取。通過如下代碼創(chuàng)建一個三維數(shù)組#創(chuàng)建三維數(shù)組>>>a=np.arange(18).reshape(3,2,3)>>>aarray([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]],[[12,13,14],[15,16,17]]])#查看數(shù)組維度>>>a.ndim3#查看數(shù)組形狀>>>a.shape(3,2,3)基礎索引所生成的數(shù)組可以通過下圖來闡述,圖中每個方框上部代表數(shù)組的值,下部代表值所對應的索引。在此例中可以發(fā)現(xiàn),第一維度是3的三維數(shù)組可以看作是3個二維數(shù)組的嵌套。同樣地,每個二維數(shù)組的第一維度是2,又可以看作是2個一維數(shù)組的嵌套。因此,在NumPy中高維數(shù)組可以理解為“數(shù)組中的數(shù)組”,這對理解高維數(shù)組的索引和切片很有幫助?;A索引>>>a=np.arange(18).reshape(3,2,3)#第0維度(軸)上的數(shù)組>>>a[0]array([[0,1,2],[3,4,5]])#三次索引>>>a[0][1][1]4#兩次索引>>>a[0][1,1]4#直接索引>>>a[0,1,1]4#負數(shù)索引>>>a[0,1,-2]4#使用索引更改數(shù)組中的數(shù)據(jù)>>>a[0,1,1]=10>>>aarray([[[0,1,2],[3,10,5]],[[6,7,8],[9,10,11]],[[12,13,14],[15,16,17]]])切片NumPy同樣提供了針對數(shù)組的切片功能,每個維度上序列切片的標準規(guī)則與Python序列切片的規(guī)則已知,即采用[起始索引:終止索引:步長]的語法結(jié)構(gòu)。負數(shù)索引指向“序列長度+負數(shù)索引”的數(shù)據(jù),負數(shù)步長表示逆向截取。圖6-2演示了3×3大小的二維數(shù)組的切片實例,從中可以發(fā)現(xiàn)通過靈活運用切片能夠獲取任意的子集。切片>>>a=np.arange(18).reshape(3,2,3)>>>aarray([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]],[[12,13,14],[15,16,17]]])#等價于a[:,:,2]>>>a[...,2]array([[2,5],[8,11],[14,17]])#等價于a[1,:,:]>>>a[1,...]array([[6,7,8],[9,10,11]])#等價于a[:,1,:]>>>a[...,1,:]array([[3,4,5],[9,10,11],[15,16,17]])>>>a=np.arange(18).reshape(3,2,3)>>>a.shape(3,2,3)#在原數(shù)組第0軸前擴展維度>>>a[np.newaxis,...].shape(1,3,2,3)#在原數(shù)組第1軸前擴展維度>>>a[:,np.newaxis,...].shape(3,1,2,3)切片“楊輝三角”是一種二項式系數(shù)的幾何排列,以三角形的形式展示。其基礎規(guī)律為第n層(頂層稱第0層,第1行,第n層即第n+1行,n為包含0在內(nèi)的自然數(shù))正好對應多項式展開的系數(shù)。例如第二層[1,2,1]是冪指數(shù)為2的二項式展開形式的系數(shù)?;跀?shù)組的切片,可以輕松地制作“楊輝三角”。下列代碼創(chuàng)建并打印4層的“楊輝三角”>>>n=5>>>c=np.ones([n,n],dtype=int)>>>foriinrange(2,n):...forjinrange(1,i):...c[i,j]=c[i-1,j-1]+c[i-1,j]>>>foriinrange(n):...print(c[i,:i+1])[1][11][121][1331][14641]高級索引NumPy數(shù)組的索引表達式可寫為“x=arr[obj]”形式,在基礎索引中,obj是以逗號分割的數(shù)字序列。當obj為一個非元組的序列或者ndarray對象時,會觸發(fā)數(shù)組的高級索引。高級索引可分為整數(shù)索引和布爾索引。整數(shù)索引采用整數(shù)數(shù)組在N維索引中選擇數(shù)組的任意項,每個整數(shù)數(shù)組表示該維度的下標值,整數(shù)索引支持負數(shù)索引,但不允許索引超出邊界。以下用一個實例演示整數(shù)索引提取二維數(shù)組四個角的數(shù)據(jù)>>>a=np.arange(9).reshape(3,3)>>>aarray([[0,1,2],[3,4,5],[6,7,8]])#需要索引[0,0],[0,2],[2,0],[2,2]位置的數(shù)據(jù)>>>rows=np.array([[0,0],[2,2]])#索引值的行數(shù)據(jù)>>>cols=np.array([[0,2],[0,2]])#索引值的列數(shù)據(jù)>>>a[rows,cols]#整數(shù)索引array([[0,2],[6,8]])高級索引布爾索引中的obj是布爾類型的數(shù)組對象,它返回原數(shù)組中索引obj為True的值,例如>>>a=np.array([[0,1],[1,1],[2,2]])#索引數(shù)組中大于等于2的數(shù)據(jù)>>>a[a>=2]array([2,2])#計算數(shù)組中每行數(shù)據(jù)之和>>>rowsum=a.sum(-1)#索引數(shù)組中行內(nèi)數(shù)據(jù)之和大于等于2的行>>>a[rowsum>=2,:]array([[1,1],[2,2]])數(shù)組形狀變換針對數(shù)組的形狀更改有.reshape()和.resize()兩種方法,它們在使用功能上一致,區(qū)別在于前者返回形狀改變后的新數(shù)組,并不會對原數(shù)組進行更改;而后者直接更改原數(shù)組且沒有返回值。#創(chuàng)建一維數(shù)組>>>a=np.arange(12)#變形為(3,4)的二維數(shù)組,不更改原數(shù)組>>>a_2d=a.reshape(3,4)>>>a_2darray([[0,1,2,3],[4,5,6,7],[8,9,10,11]])#變形為(2,3,4)的三維數(shù)組,不更改原數(shù)組>>>a_3d=a.reshape(2,2,3)>>>a_3darray([[[0,1,2],[3,4,5]],[[6,7,8],[9,10,11]]])#將多維數(shù)組轉(zhuǎn)化為一維數(shù)組>>>a_3d.reshape(-1)array([0,1,2,3,4,5,6,7,8,9,10,11])#變形為(3,4)的二維數(shù)組,更改原數(shù)組>>>a.resize(3,4)>>>aarray([[0,1,2,3],[4,5,6,7],[8,9,10,11]])數(shù)組合并數(shù)組的合并與拼接有兩種函數(shù),分別是np.concatenate()和np.stack(),不同之處在于前者是沿選定的現(xiàn)有軸進行數(shù)組的合并(不產(chǎn)生新的軸),而后者會沿著新產(chǎn)生的軸進行拼接。基于這個特點,np.stack()要求參與拼接的數(shù)組需要有完全相同的形狀,而np.concatenate()允許參與合并的軸上的維度不同。#分別創(chuàng)建(3,4)形狀和(3,2)形狀的兩個二維數(shù)組,數(shù)組內(nèi)元素隨機>>>a,b=np.random.randn(3,4),np.random.randn(3,2)#將兩個相同數(shù)組沿新創(chuàng)建的0軸拼接>>>np.stack([a,a],axis=0).shape(2,3,4)#將兩個相同數(shù)組沿已有的0軸拼接>>>np.concatenate([a,a],axis=0).shape(6,4)#將兩個相同數(shù)組沿新創(chuàng)建的1軸拼接>>>np.stack([a,a],axis=1).shape(3,2,4)#將兩個相同數(shù)組沿已有的1軸拼接>>>np.concatenate([a,a],axis=1).shape(3,8)#將將兩個不同數(shù)組沿已有的1軸拼接>>>np.concatenate([a,c],axis=1).shape(3,6)#形狀不同的數(shù)組無法使用np.stack()>>>np.stack([a,b],axis=0).shapeValueError:allinputarraysmusthavethesameshape數(shù)組拆分數(shù)組拆分需要用到np.split()函數(shù),其接受待拆分的數(shù)組,拆分條件和拆分的軸(默認為axis=0)作為輸入?yún)?shù),輸出包含拆分后數(shù)組的列表。拆分條件可以是一個整數(shù)或者排序好的一維數(shù)組(由小到大),當拆分條件是整數(shù)時,數(shù)組將會沿指定軸進行均勻拆分,當這種均勻拆分不可實現(xiàn)時程序?qū)箦e;當拆分條件是一維數(shù)組時,將一維數(shù)組作為索引進行拆分,當索引超過對應軸的維度大小時,返回一個空的子數(shù)組。>>>a=np.random.randn(2,4,5)#沿1軸以整數(shù)均勻拆分原數(shù)組>>>even_split=np.split(a,2,axis=1)>>>print("拆分前數(shù)組的形狀為{}\n拆分后的數(shù)組形狀分別為{},{}"\.format(a.shape,even_split[0].shape,even_split[1].shape))拆分前數(shù)組的形狀為(2,4,5)拆分后的數(shù)組形狀分別為(2,2,5),(2,2,5)#沿1軸以一維數(shù)組按索引拆分原數(shù)組>>>array_split=np.split(a,[2,3],axis=1)>>>array_split[0].shape#結(jié)果等同于a[:,:2,:](2,2,5)>>>array_split[1].shape#結(jié)果等同于a[:,2:3,:](2,1,5)>>>array_split[2].shape#結(jié)果等同于a[:,3:,:](2,1,5)數(shù)組計算>>>a=np.array([[1,2],[3,4]],dtype=np.float64)>>>b=np.array([[7,8],[9,10]],dtype=np.float64)#逐元素相加,等價于np.dot(a,b)>>>a+barray([[8.,10.],[12.,14.]])#逐元素相減,等價于np.subtract(a,b)>>>a-barray([[-6.,-6.],[-6.,-6.]])#逐元素相乘,等價于np.multiply(a,b)>>>a*barray([[7.,16.],[27.,40.]])#逐元素相除,等價于np.divide(a,b)>>>a/barray([[0.14285714,0.25],[0.33333333,0.4]])數(shù)組計算>>>a=np.array([[1,2],[3,4]])#求數(shù)組所有數(shù)據(jù)之和>>>np.sum(a)10#對第1軸(從0開始)求和>>>np.sum(a,axis=1)array([3,7])#對第0軸求平均值>>>np.mean(a,axis=0)array([2.,3.])#對第0軸取最大值,即在a[0,:]和a[1,:]中取最大值>>>np.max(a,axis=0)array([3,4])>>>a=np.array([[1,2],[3,4]],dtype=np.float64)>>>b=np.array([[7,8],[9,10]],dtype=np.float64)>>>v=np.array([5,6],dtype=np.float64)#矩陣相乘,等價于np.matmul(a,b)或np.dot(a,b)或a.dot(b)>>>a@barray([[25.,28.],[57.,64.]])#矩陣與向量相乘,等價于np.matmul(a,bb)或np.dot(a,v)或a.dot(v)>>>a@varray([17.,39.])廣播機制播機制(Broadcasting)是NumPy在算術運算期間處理不同形狀數(shù)組的一種機制,即較小的數(shù)組在運算期間會在較大是數(shù)組上“廣播”,使其具有兼容的形狀>>>a=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])>>>b=np.array([1,2,3])>>>a.shape,b.shape((4,3),(3,))#數(shù)組與向量相加,觸發(fā)廣播機制>>>a+barray([[2,4,6],[5,7,9],[8,10,12],[11,13,15]])實例:網(wǎng)約車平臺數(shù)據(jù)分析03網(wǎng)約車平臺數(shù)據(jù)分析現(xiàn)有某網(wǎng)約車公司上半年的平臺數(shù)據(jù),數(shù)據(jù)包含了每單出行業(yè)務的發(fā)起時間、出行距離、出行持續(xù)時間、乘客支付費用等相關信息。在本案例中,將基于該數(shù)據(jù)集,通過NumPy分析如下數(shù)據(jù)信息:1.所有司機的平均速度;2.三月份乘客的乘車次數(shù);3.單筆費用超過50元的出行單數(shù)及其占單數(shù)總量的百分比。數(shù)據(jù)導入使用np.loadtext()函數(shù)可以導入“csv”格式文件為ndarray。下列代碼對數(shù)據(jù)集進行導入,并在導入時設置不導入表的第一行(即表頭標簽數(shù)據(jù))。>>>importnumpyasnp>>>data=np.loadtxt("taxis_dataset.csv",delimiter=",",skiprows=1)>>>data_shape=data.shape>>>print("該數(shù)據(jù)集共有{:.0f}條數(shù)據(jù),{:.0f}項特征。"\.format(data_shape[0],data_shape[1]))該數(shù)據(jù)集共有89560條數(shù)據(jù),11項特征。速度值計算速度值的計算需基于路程和時間數(shù)據(jù)。通過NumPy的切片功能便可取得行駛距離和行駛時間對應列的數(shù)據(jù),這里需要注意單位的轉(zhuǎn)換。利用數(shù)組矢量化操作的方式求得每次出行的速度,并進行平均值的求解。通過如下代碼可以求得平均速度為32.24km/h。>>>distance=data[:,7]#每單出行的距離>>>duration=data[:,8]/3600#每單出行的時間,單位要換為小時>>>speed=distance/duration#矢量化運算>>>mean_speed=speed.mean(axis=0)#求平均值>>>print("所有司機的平均速度為{:.2f}km/h".format(mean_speed))所有司機的平均速度為32.24km/h乘客數(shù)量計算為求得三月份乘車的乘客數(shù)量,可以使用np.unique()函數(shù)分析月份列,返回每個月份在數(shù)據(jù)集中出現(xiàn)的次數(shù)。由下列代碼的從返回結(jié)果中可以直觀得到3月份乘客的乘車次數(shù)為15547次。該任務亦可通過數(shù)組索引的方法求解,感興趣的讀者可自行嘗試>>>months=data[:,1]#獲取月份數(shù)據(jù)>>>values,counts=np.unique(months,return_counts=True)>>>foriinrange(len(values)): print("{:.0f}月乘客乘車的次數(shù)為:{:.0f}次"\.format(values[i],counts[i]))1月乘客乘車的次數(shù)為:13481次2月乘客乘車的次數(shù)為:13333次3月乘客乘車的次數(shù)為:15547次4月乘客乘車的次數(shù)為:14810次5月乘客乘車的次數(shù)為:16650次6月乘客乘車的次數(shù)為:15739次可視化通常在進行數(shù)據(jù)分析時,可視化是很好的工具。下列代碼將每月乘客乘車的次數(shù)利用柱狀圖直觀表示,繪制的圖像如圖所示。圖中以水平虛線標注月乘客乘車次數(shù)平均值,并輔以文字注釋。關于可視化的內(nèi)容將在數(shù)據(jù)可視化章節(jié)中詳細張開介紹,現(xiàn)階段無需具體理解這段代碼含義。>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False#計算月平均值>>>mean_counts=counts.mean()>>>fig,ax=plt.subplots(figsize=(12,6))>>>bar_plot=ax.bar(values,counts,color='g',alpha=0.5)>>>ax.axhline(mean_counts,color='k',linestyle='dashed',linewidth=2)>>>ax.annotate('月平均值:{}'.format(int(mean_counts)),xy=(1,mean_counts+500),color='black')>>>ax.bar_label(bar_plot,padding=2)>>>ax.set_title("每月乘客乘車次數(shù)")>>>ax.set_xlabel("月份")>>>ax.set_ylabel("乘車次數(shù)")>>>plt.grid()>>>plt.show()結(jié)果>>>amount=data[:,-2]#獲取金額數(shù)據(jù)>>>greater_50=amount[amount>50]#高級索引中的布爾索引>>>percentage=greater_50.shape[0]/amount.shape[0]*100#百分比計算>>>print("單筆費用超過50元的出行單數(shù)共有{:.0f}單\n占總量的{:.2f}%"\.format(greater_50.shape[0],percentage))單筆費用超過50元的出行單數(shù)共有41571單占總量的46.42%實例:股票歷史價格分析04問題分析股票歷史價格以時間序列的形式反映出市場與公司的有關信息,在分析某只股票歷史股價時,通常會遇到如下的問題:給定這只股票的在某個時段的股價序列,并假設只能進行一次買入和一次賣出,且無法做空,可以獲得的每股最大利潤是多少?例如,歷史股價為(22,15,13,19,20,21,15),此時在13元/股時買入并在21元/股時賣出時獲得最大利潤,為8元/股。本節(jié)將使用NumPy對該案例問題進行求解。問題分析對于這類的問題,最直觀的方案就是窮舉每兩個股價的組合,約束為第二個股價出現(xiàn)在第一個股價之后,取差值最大的組合便是最大利潤,這種方案的時間復雜度為。與之相比更優(yōu)的方案是,對股價序列進行一次迭代,找出每個價格與最低股價的差異,同時對比最大利潤值,這種方案的時間復雜度為。下列代碼對這種方案進行函數(shù)實現(xiàn)并執(zhí)行功能驗證。#計算股價序列最大利潤,時間復雜度為O(n)>>>defprofit_vanillaPython(prices):#最大利潤值,初始化為0...max_profit=0#最低股價,初始化為股價序列的第一個值...min_price=prices[0]...forpriceinprices[1:]:...min_price=min(min_price,price)...max_profit=max(price-min_price,max_profit)...returnmax_profit#功能驗證>>>profit_vanillaPython((22,15,13,19,20,21,15))8問題分析當然,這個問題是可以利用NumPy矢量化求解的,這里需要用到NumPy的ufunc(universalfunvtion)函數(shù),這類函數(shù)作用于數(shù)組上的每一個元素,而不是針對數(shù)組對象,其運算速度要高于循環(huán)與列表推導式。在本問題中,采用的是np.minimum.accumulate,它沿指定軸計算最小值,并保留中間結(jié)果?;诖?,可以構(gòu)建出基于NumPy的計算利潤最大值的函數(shù)>>>importnumpyasnp>>>prices=(22,15,13,19,20,21,15)>>>prices=np.asarray(prices)>>>np.minimum.accumulate(prices)array([22,15,13,13,13,13,13])#矢量化計算股價序列最大利潤>>>defprofit_numpy(prices):...prices=np.asarray(prices)...returnnp.max(prices-np.minimum.accumulate(prices))#功能驗證>>>profit_numpy((22,15,13,19,20,21,15))8矢量化的高效性用隨機生成的長度為1000的整數(shù)序列來驗證NumPy函數(shù)的高效性,觀察下列代碼的輸出結(jié)果,使用NumPy方法比使用原生Python循環(huán)在CPU上的效率提高了60多倍。雖然兩種方法都有相同的理論時間復雜度,但NumPy的運行機制在實際解決方案中發(fā)揮了重大的作用。>>>seq=np.random.randint(0,100,size=100000)#原生Python方法運行時間>>>%%time...profit_vanillaPython(seq)CPUtimes:user67.3ms,sys:2.97ms,total:70.3msWalltime:70.3ms#NumPy矢量化方法運行時間>>>%%time...profit_numpy(seq)CPUtimes:user1.01ms,sys:434μs,total:1.44msWalltime:717μs股票數(shù)據(jù)設計接下來,利用NumPy生成一個仿真的股票歷史股價序列。首先構(gòu)建一個由NaN構(gòu)成的一維數(shù)組,在一維數(shù)組上設置若干拐點(局部最高與最低點),隨后對數(shù)組進行一維插值,并增加噪音#創(chuàng)建長度為200的序列,初始值為NaN>>>prices=np.full(200,fill_value=np.nan)#設置序列中的拐點>>>prices[[0,20,40,60,85,110,145,-1]]=[70.,30.,45.,30.,70.,60.,20.,45.]>>>x=np.arange(len(prices))>>>is_valid=~np.isnan(prices)#進行線性插值>>>prices=erp(x=x,xp=x[is_valid],fp=prices[is_valid])#增加噪聲數(shù)據(jù)>>>prices+=np.random.randn(len(prices))*5利潤函數(shù)當前的profit_numpy函數(shù)已經(jīng)可以高效地計算出股價序列中的最大利潤,在需要知道買入和賣出的點位時,可以對函數(shù)作如下改進,此時函數(shù)會返回(買入時間,賣出時間,最大利潤)的元組>>>defprofit_numpy_with_index(prices):...prices=np.asarray(prices)...profit_array=prices-np.minimum.accumulate(prices)...#計算最佳賣出點位...sell_index=np.argmax(profit_array)...#計算最佳買入點位...buy_index=np.argmin(prices[:sell_index])...returnbuy_index,sell_index,np.max(profit_array)代碼整合>>>mn,mx,max_profit=profit_numpy(prices)>>>print("最佳買入點位:{:.2f}元/股\n最佳賣出點位:{:.2f}元/股\n最大利潤:{:.2f}元/股\n".format(prices[mn],prices[mx],max_profit))最佳買入點位:21.10元/股最佳賣出點位:75.97元/股最大利潤:54.87元/股可視化>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False>>>x1,x2,x3=[mn,(mx+mn)/2],[(mx+mn)/2,(mx+mn)/2],[(mx+mn)/2,mx]>>>y1,y2,y3=[prices[mn],prices[mn]],[prices[mn],prices[mx]],[prices[mx],prices[mx]]>>>fig,ax=plt.subplots(figsize=(12,5))>>>ax.plot(prices,color='b')>>>ax.set_title('歷史股價走勢圖')>>>ax.set_xlabel('天')>>>ax.set_ylabel('股票價格')>>>ax.plot(mn,prices[mn],color='green',marker='v',markersize=10,label="最佳買入點")>>>ax.plot(mx,prices[mx],color='red',marker='^',markersize=10,label="最佳賣出點")>>>ax.plot(x1,y1,linestyle='dotted',color='k')>>>ax.plot(x2,y2,linestyle='dotted',color='k')>>>ax.plot(x3,y3,linestyle='dotted',color='k')>>>ax.annotate('最大利潤:{:.2f}'.format(max_profit),xy=((mx+mn)/2-25,prices[mx]-10),color='black')>>>ax.legend()>>>plt.grid()>>>plt.show()實例:摩爾定律的驗證05問題分析摩爾定律是由英特爾公司的聯(lián)合創(chuàng)始人戈登·摩爾的名字命名的,該定律的內(nèi)容為:當價格不變時,集成電路上可容納的晶體管數(shù)量大約每兩年翻一番。其在一定程度上揭示了信息技術的發(fā)展和進步速度的。在案例中,將使用NumPy分析從1971到2017年的芯片晶體管數(shù)量的發(fā)展趨勢,利用最小二乘構(gòu)建分析模型,并與摩爾定律進行對比。數(shù)據(jù)讀取在本例中,關注的是生產(chǎn)時間和晶體管的數(shù)量,其他諸如處理器名稱、生產(chǎn)廠商、制造工藝等信息是不需要的。因此在導入數(shù)據(jù)時只需保留第二列和第三列,利用np.loadtext()函數(shù)可以導入“.csv”格式的文件。在導入完成后,利用NumPy的切片取數(shù)據(jù)集前5年的年份和晶體管數(shù)量驗證數(shù)據(jù)集是否正確導入。>>>importnumpyasnp>>>data=np.loadtxt("transistor_counts.csv",delimiter=",",\usecols=[1,2],skiprows=1)#導入數(shù)據(jù),只保留第二、第三列,去掉標題行>>>transistor_count,year=data[:,0],data[:,1]>>>print("生產(chǎn)時間:\t",year[:5])#數(shù)據(jù)集前5年年份>>>print("晶體管數(shù)量:\t",transistor_count[:5])#數(shù)據(jù)集前5年晶體管數(shù)量生產(chǎn)時間: [1971.1972.1975.1974.1974.]晶體管數(shù)量: [2300.3500.3510.4100.4500.]公式計算根據(jù)摩爾定律,每兩年集成電路中可容納的晶體管數(shù)量就會上漲一倍,這與數(shù)學上的指數(shù)函數(shù)相符,可以得到如下公式:>>>Am=np.log(2)/2#每兩年增長一倍>>>Bm=np.log(2300)-Am*1971#初始值由1971年的數(shù)據(jù)確定>>>Moores_law=lambdayear:np.exp(Bm)*np.exp(Am*year)#摩爾定律公式>>>transistor_Moores_law=Moores_law(year)#摩爾定律預測值公式計算通過構(gòu)建的公式推測1973年芯片中晶體管的數(shù)量,如是1971年的兩倍,則代表公式正確>>>ML1971=Moores_law(1971)#摩爾定律預測1971年芯片中晶體管的數(shù)量>>>ML1973=Moores_law(1973)#摩爾定律預測1973年芯片中晶體管的數(shù)量>>>print("在1973年,摩爾定律預測一個芯片可以容納{:.0f}\個晶體管".format(ML1973))>>>print("這是1971年芯片中晶體管數(shù)量的{:.0f}倍".format(ML1973/ML1971))在1973年,摩爾定律預測一個芯片可以容納4600個晶體管這是1971年芯片中晶體管數(shù)量的2倍最小二乘預測接下來,通過數(shù)據(jù)集中的數(shù)據(jù)建立最小二乘模型,并與摩爾定律進行比較。最小二乘模型需要最小化晶體管數(shù)量的實際值與預測值,即在求解數(shù)據(jù)擬合和模型建立的問題中,Python有諸如Scipy,Scikit-Learn,Statsmodel等專業(yè)的第三方資源庫。對于簡單的最小二乘模型,也可以直接使用NumPy的np.linalg.lstsq()函數(shù)>>>yi=np.log(transistor_count)#尺寸為(102,)>>>yi=yi[:,np.newaxis]#尺寸為(102,1)>>>Z=year[:,np.newaxis]**[1,0]#自變量矩陣,系數(shù)為年份和1>>>Z[:5,:]array([[1971.,1.],[1972.,1.],[1975.,1.],[1974.,1.],[1974.,1.]])>>>A=np.linalg.lstsq(Z,yi)#求解最小二乘>>>print("A_lstq:\t{:.3f}\nB_lstq:\t{:.3f}"\.format(A[0].item(0),A[0].item(1)))#系數(shù)A和B的值A_lstq: 0.348B_lstq: -678.032>>>transistor_count_lstq=np.exp(Z@A[0])#最小二乘預測值可視化>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False>>>fig,ax=plt.subplots(figsize=(8,4))>>>ax.semilogy(year,transistor_count,"s",label="微處理器",markerfacecolor='none')>>>ax.semilogy(year,transistor_Moores_law,label="摩爾定律",linewidth='3',linestyle='solid',)>>>ax.semilogy(year,transistor_count_lstq,label="最小二乘法",linewidth='3',linestyle='dashed')>>>ax.set_title("微處理器中的晶體管數(shù)量")>>>ax.set_xlabel("發(fā)布年份")>>>ax.set_ylabel("晶體管數(shù)量")>>>ax.legend()>>>ax.grid()>>>plt.show()模型存儲至此,已使用NumPy構(gòu)建了摩爾定律模型和最小二乘模型??梢詫煞N模型的預測數(shù)據(jù)一并保存至“.csv”文件中,以便后續(xù)的分析和使用。首先對文件的表頭進行描述和定義。>>>head="此文件的列包含\n年份:微處理器初次生產(chǎn)的年份\n">>>head+="晶體管數(shù)量:制造商給出的一個芯片內(nèi)容納的晶體管數(shù)量\n">>>head+="晶體管數(shù)量_最小二乘:最小二乘模型=\exp({:.2f})*exp({:.2f}*year)\n".format(A[0].item(1),A[0].item(0))>>>head+="晶體管數(shù)量_摩爾定律:摩爾定律=\exp({:.2f})*exp({:.2f}*year)\n".format(Bm,Am)>>>head+="年份:,晶體管數(shù)量:,晶體管數(shù)量_最小二乘:,\
晶體管數(shù)量_摩爾定律:">>>print(head)此文件的列包含年份:微處理器初次生產(chǎn)的年份晶體管數(shù)量:制造商給出的一個芯片內(nèi)容納的晶體管數(shù)量晶體管數(shù)量_最小二乘:最小二乘模型=exp(-678.03)*exp(0.35*year)晶體管數(shù)量_摩爾定律:摩爾定律=exp(-675.36)*exp(0.35*year)年份:,晶體管數(shù)量:,晶體管數(shù)量_最小二乘:,晶體管數(shù)量_摩爾定律:模型存儲>>>data=np.block([year[:,np.newaxis],transistor_count[:,np.newaxis],transistor_count_lstq[:],transistor_Moores_law[:,np.newaxis],])>>>np.savetxt("transisitor_mooreslaw_regression.csv",X=data,\delimiter=",",header=head)#保存文件>>>%%cmd...powershell-command"&{Get-Contenttransisitor_mooreslaw_regression.csv-TotalCount10}"#此文件的列包含#年份:微處理器初次生產(chǎn)的年份#晶體管數(shù)量:制造商給出的一個芯片內(nèi)容納的晶體管數(shù)量#晶體管數(shù)量_最小二乘:最小二乘模型=exp(-678.03)*exp(0.35*year)#晶體管數(shù)量_摩爾定律:摩爾定律=exp(-675.36)*exp(0.35*year)#年份:,晶體管數(shù)量:,晶體管數(shù)量_最小二乘:,晶體管數(shù)量_摩爾定律:1.971000000000000000e+03,2.300000000000000000e+03,1.097541082545697918e+03,2.299999999999972260e+031.972000000000000000e+03,3.500000000000000000e+03,1.553682874969319073e+03,3.252691193458359976e+031.975000000000000000e+03,3.510000000000000000e+03,4.407447613717454260e+03,9.199999999999923602e+031.974000000000000000e+03,4.100000000000000000e+03,3.113476310484809801e+03,6.505382386916362520e+03第7章可視化分析目錄contents從數(shù)據(jù)到圖形面向?qū)ο蟮睦L圖模式實例:人口金字塔可視化分析實例:電商數(shù)據(jù)可視化分析實例:氣象數(shù)據(jù)可視化分析Matplotlib大數(shù)據(jù)和人工智能時代,數(shù)據(jù)科學一項重要的任務是對海量的數(shù)據(jù)進行直觀地描述、總結(jié)和表示。相比文本數(shù)據(jù),圖表數(shù)據(jù)可以更加清晰、高效地展示數(shù)據(jù)的信息。在很多情況下,執(zhí)行數(shù)據(jù)分析的第一步便是對數(shù)據(jù)進行可視化分析,并從中獲得數(shù)據(jù)的異常值、必要的數(shù)據(jù)轉(zhuǎn)換、模型設計的洞察等信息。Matplotlib是Python社區(qū)中應用最廣泛的可視化庫,其基于NumPy的數(shù)組繪制出版級別的可視化圖形(包括二維圖像和三維圖形),并可與Scipy,Pandas等第三方庫聯(lián)合使用。隨著Python的流行,Matplotlib衍射出了諸如Seaborn,ggplot等高級封裝的數(shù)據(jù)可視化庫,這些庫都使用Matplotlib作為底層進行繪圖。本章將講解Matplotlib的基本功能,并介紹基于Matplotlib的數(shù)據(jù)可視化分析任務處理。Matplotlib庫包含有pylab和pyplot兩類接口。在最初時,Matplotlib的設計與MATLAB高度類似,并因此產(chǎn)生了pylab模塊,其旨在模仿MATLAB的全局風格。然而,pylab的使用會影響Python的內(nèi)置函數(shù)并可能導致難以跟蹤的錯誤污染命名空間,如今Matplotlib官方已放棄pylab并明確建議不使用該模塊。為此,在任何情況下都應該使用pyplot模塊。Matplotlib可以通過conda或者pip命令進行安裝,在安裝完成后,通常以如下方式進行引用>>>importmatplotlib.pyplotasplt從數(shù)據(jù)到圖形01基礎圖形下面通過一個圖形案例來熟悉Matplotlib中pyolot的基礎功能。在以下的例子中,將繪制正弦曲線的圖形,其思路為首先使用NumPy生成包含[0,4π]之間的等距分割的200個點的一維數(shù)組,計算出其對應的正弦值,再基于這兩個數(shù)組使用pyplot生成如圖所示的圖形。>>>x=np.linspace(0,4*np.pi,200)#生成正弦曲線上的點的橫軸坐標>>>y=np.sin(x)#計算正弦曲線上的點的縱軸坐標>>>plt.plot(x,y)#繪制正弦曲線圖形>>>plt.show()#將生成的圖形展示plot()函數(shù)matplotlib.pyplot.plot(x,y,fmt,data,**kwargs)其中x,y是標量或“array-like”的對象,作為數(shù)據(jù)點的橫軸、縱軸坐標,當“x”沒有明確給定時,其默認為等于range(len(y));“fmt”為格式字符串,不是必須項,用于對繪制圖形的樣式屬性進行快速設置。其格式為“[標記(marker)][線條(line)][顏色(color)]”,這三項的每一項都是可選的且不需明確按上述的順序。如“bo”中沒有給定線條參數(shù),代表藍色圓圈的標記但不繪制線條。表7-1至表7-3給出了每項格式字符串參數(shù)常用的取值,這些屬性也可以通過關鍵字參數(shù)進行設定;“data”是可索引對象,不是必須項,其為有標簽數(shù)據(jù)的對象(如字典對象),用于提供參數(shù)中的數(shù)據(jù)。格式字符串fmt中標記樣式的常用符號符號描述符號描述'.'點標記'*'星號標記','像素標記'h'垂直六邊形標記'o'圓標記'H'水平六邊形標記'v'下三角標記'+'加號標記'^'上三角標記'P'實心加號標記'<'左三角標記'x'叉號標記'>'右三角標記'X'實心加號標記'8'八角形標記'D'菱形標記's'正方形標記'|'垂直線標記'p'五邊形標記'_'水平線標記格式字符串fmt中線條樣式的常用取值符號描述'-'實線樣式'--'破折線樣式'-.'點劃線樣式':'點虛線樣式格式字符串fmt中顏色的常用取值符號描述符號描述'b'藍色(Blue)'m'品紅色(magenta)'g'綠色(Green)'y'黃色(Yellow)'r'紅色(Red)'k'黑色(Black)'c'青色(Cyan)'w'白色(White)Matplotlib展現(xiàn)圖像繪制正弦曲線圖形代碼的最后一行是將結(jié)果進行展現(xiàn)供可視化分析。Matplotlib展現(xiàn)圖像的方式可以分為三種情況:1.在腳本文件(.py)中:需要調(diào)用plt.show()函數(shù),該函數(shù)會啟動事件循環(huán),查找所有當前活動的圖形對象,并打開顯示圖形交互的窗口。2.在IPython筆記本(如JupyterNotebook)中:在內(nèi)核中運行%matplotlibinline后,創(chuàng)建繪圖的單元格都將嵌入所得圖形的PNG圖像,而無需調(diào)用plt.show()函數(shù)。3.在IPythonshell中:在啟動后輸入%matplotlib魔術命令后,任何pyplot的繪圖命令都會打開一個圖形窗口,可以運行更多命令來更新繪制窗口,而無需調(diào)用plt.show()函數(shù)。多組數(shù)據(jù)繪制1.多次調(diào)用plt.plot()函數(shù):此方法最為直接且最為常用。如下列代碼所示,正弦曲線使用綠色實現(xiàn)繪制,余弦曲線使用紅色虛線繪制。值得注意的是當有多項數(shù)據(jù)時,可以使用關鍵字參數(shù)“l(fā)abel=”明確每個數(shù)據(jù)對應的圖像名稱,并利用plt.legend()函數(shù)將圖例進行顯示,以便在分析時更好地認識數(shù)據(jù)結(jié)構(gòu)。>>>x=np.linspace(0,4*np.pi,200)#生成橫軸坐標>>>y_sin=np.sin(x)#生成正弦曲線的縱軸坐標>>>y_cos=np.cos(x)#生成余弦曲線的縱軸坐標>>>plt.plot(x,y_sin,'g-',label='sin(x)')#繪制正弦曲線圖形為綠色實線>>>plt.plot(x,y_cos,'r-.',label='cos(x)')#繪制余弦曲線圖形為紅色虛線>>>plt.legend()#顯示圖例>>>plt.show()多組數(shù)據(jù)繪制在同一個plt.plot()指定多組x,y和fmt參數(shù):此類方法只需要調(diào)用一次plt.plot()函數(shù),但需在函數(shù)內(nèi)部輸入每組(x,y,fmt)的數(shù)據(jù)。使用此種方法需要注意無法在plt.plot()函數(shù)中制定多個標簽,故需要將標簽信息移動到圖例展示的函數(shù)plt.legend()中,具體代碼如下所示>>>x=np.linspace(0,4*np.pi,200)#生成橫軸坐標>>>y_sin=np.sin(x)#生成正弦曲線的縱軸坐標>>>y_cos=np.cos(x)#生成余弦曲線的縱軸坐標>>>plt.plot(x,y_sin,'g-',x,y_cos,'r-.')#同時繪制正弦曲線和余弦曲線圖形>>>plt.legend(['sinx','cosx'])#顯示圖例,并在圖例中明確正弦和余弦曲線的標簽圖像設置通常完整的繪圖圖形還包括標題,軸標簽等信息,分別可以通過pyplot中的title()、xlabel()、ylabel()等函數(shù)進行設置。同時在數(shù)據(jù)分析時常運用到網(wǎng)格線進行輔助觀察,這可以通過pyplot中的gird()函數(shù)設置。下列代碼將正弦與曲線圖形的橫縱軸分別標記為x軸和y軸,設置圖形標題為“正弦與余弦曲線”,并設置橫縱軸的網(wǎng)格線>>>x=np.linspace(0,4*np.pi,200)#生成橫軸坐標>>>y_sin=np.sin(x)#生成正弦曲線的縱軸坐標>>>y_cos=np.cos(x)#生成余弦曲線的縱軸坐標>>>plt.plot(x,y_sin,'g-',label='sin(x)')#繪制正弦曲線圖形為綠色實線>>>plt.plot(x,y_cos,'r-.',label='cos(x)')#繪制余弦曲線圖形為紅色虛線>>>plt.legend()#顯示圖例>>>plt.xlabel('x')#設置x軸標簽為“x”>>>plt.ylabel('y')#設置y軸標簽為“y”>>>plt.title('GraphsofSineandCosineCruves')#設置標題>>>plt.grid()#設置網(wǎng)格線>>>plt.show()中文支持在Matplotlib中,默認的字體是不支持中文格式的,因此如果在上述代碼直接將標題和軸坐標設置為中文將會出現(xiàn)中文亂碼。若需要在圖像中顯示中文字符,有兩種方式:1.修改配置文件:Matplotlib從配置文件matplotlibrc中讀取相關配置信息,比如字體、樣式等,因此可修改此配置文件中的字體為支持中文字體的樣式。此方法雖然可以在當前本地終端正確顯示中文,但在新的終端上運行代碼依然存在亂碼問題,且不同操作系統(tǒng)的配置文件修改方法亦不盡相同。2.在代碼中動態(tài)設置:直接在Python代碼中動態(tài)設置字體信息,此方法方便靈活,亦避免了修改配置文件。如下列代碼所示,需要注意的是更改字體后會導致負號符號的顯示異常,故還需對符號進行配置。同時這種方式僅針對當前的腳本或內(nèi)核,重新啟動內(nèi)核或運行腳本需重新運行這段代碼。>>>plt.rcParams['font.family']='SimHei'#指定默認字體為黑體>>>plt.rcParams['axes.unicode_minus']=False#解決負號負號異常問題>>>plt.rcParams['font.family']='SimHei'#指定默認字體為黑體>>>plt.rcParams['axes.unicode_minus']=False#解決負號負號異常問題中文支持>>>plt.rcParams['font.family']='SimHei'#指定默認字體為黑體>>>plt.rcParams['axes.unicode_minus']=False#解決負號負號異常問題>>>x=np.linspace(0,4*np.pi,200)>>>y_sin=np.sin(x)>>>y_cos=np.cos(x)>>>plt.plot(x,y_sin,'g-',label='
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年軟件項目開發(fā)協(xié)議標準格式范本版
- 2024年車牌租賃及轉(zhuǎn)租業(yè)務合作協(xié)議范本3篇
- 河南省安陽市第三中學2025屆中考三模生物試題含解析
- 2024年重慶馨妮絲美容整形高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 【2024版】八年級道德與法治第一次月考卷01(全解全析)(統(tǒng)編版)
- 特種設備管理制度
- 個人思想政治工作總結(jié)
- 遼寧地質(zhì)工程職業(yè)學院《網(wǎng)絡爬蟲技術》2023-2024學年第一學期期末試卷
- 在線聊天客戶服務合同(2篇)
- 地質(zhì)勘察合同(2篇)
- 熱工自動化系統(tǒng)檢修運行維護規(guī)程
- 2023年八年級物理實驗報告單
- 顱內(nèi)壓增高病人的護理
- 裝配式混凝土建筑構(gòu)件識圖-疊合板識讀(裝配式混凝土建筑)
- 鑲嵌式電力調(diào)度模擬屏通用技術條件
- 新流動資金測算表(帶公式)
- GB/T 29076-2021航天產(chǎn)品質(zhì)量問題歸零實施要求
- GB/T 10801.1-2021絕熱用模塑聚苯乙烯泡沫塑料(EPS)
- 行政單位采購實施和驗收結(jié)算子流程圖模板
- DL-T 5190.1-2022 電力建設施工技術規(guī)范 第1部分:土建結(jié)構(gòu)工程(附條文說明)
- 《了凡四訓》課件
評論
0/150
提交評論