Python語言實用教程第10章-科學(xué)計算課件_第1頁
Python語言實用教程第10章-科學(xué)計算課件_第2頁
Python語言實用教程第10章-科學(xué)計算課件_第3頁
Python語言實用教程第10章-科學(xué)計算課件_第4頁
Python語言實用教程第10章-科學(xué)計算課件_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 Python是數(shù)據(jù)科學(xué)家最喜歡的語言之一。Python本身就是一門工程性語言,數(shù)據(jù)科學(xué)家用Python實現(xiàn)的算法,可以直接用在產(chǎn)品中。 Python的科學(xué)計算方面相關(guān)類庫非常多,常用的有:NumPy、SciPy、Matplotlib、Pandas、StatsModels、Scikit-Learn、Keras、Gensim等。高性能的科學(xué)計算類庫NumPy和SciPy,給其他高級算法打了非常好的基礎(chǔ),Matplotlib讓Python畫圖變得像Matlab一樣簡單。第10章 科學(xué)計算 學(xué)習(xí)重點或難點: NumPy的基本使用 SciPy的基本使用 Matplotlib的基本使用 NumPy是一個

2、定義了數(shù)值數(shù)組和矩陣類型和它們的基本運算的語言擴展;SciPy是另一種使用NumPy來做高等數(shù)學(xué)、信號處理、優(yōu)化、統(tǒng)計和許多其它科學(xué)任務(wù)的語言擴展;Matplotlib是一個幫助繪圖的語言擴展。NumPy、SciPy、Matplotlib堪稱為Python科學(xué)計算的三劍客。第10章 科學(xué)計算10.1 NumPy等的安裝10.2 NumPy基本應(yīng)用10.3 SciPy基本應(yīng)用10.4 Matplotlib基本應(yīng)用10.5 數(shù)據(jù)分析模塊pandas第10章 科學(xué)計算10.1 NumPy等的安裝(1)安裝Numpy() cmd管理員模式(啟動命令窗口),輸入:pip install numpy。nu

3、mpy會自己開始下載安裝,等待它提示成功即可。(2)安裝SciPy() 打開 https:/sourceforge.Net/projects/scipy/files/scipy/0.15.1/。有很多個壓縮包,找到適合Python 2.7.x并且下載量比較多的某個exe版,運行之一直下一步就OK。(3)安裝MatPlotLib() cmd管理員模式,直接復(fù)制粘貼下面的命令,安裝完成后會提示完成,就OK了。 python -m pip install -U pip setuptools python -m pip install matplotlib 因為MatplotLib的使用需要Numpy

4、的支持,所以應(yīng)先裝NumPy再裝MatplotLib。10.1 NumPy等的安裝 另外,Numpy、SciPy、MatplotLib也都可以下載它們的exe文件來安裝,下載地址: NumPy:/projects/numpy/files/NumPy/1.9.2/ SciPy:/projects/scipy/files/scipy/0.15.1/ MatPlotLib: /downloads.html 其中,NumPy和SciPy沒有32和64位的區(qū)別,MatPlotLib需要根據(jù)自己的系統(tǒng)選擇32位和64位的。再次提醒,這三個庫一定都要下載對應(yīng)版本的exe文件。下載完成后依次安裝就可,它們會自

5、動找到之前安裝好的Python所在的路徑的。 實際上,Numpy、SciPy、MatplotLib的安裝還可以下載安裝包實現(xiàn)。譬如,下載相應(yīng)的Numpy安裝包(.whl格式的)。安裝時,先進入whl安裝包的存放目錄。再使用命令行安裝:pip install numpy文件名.whl。10.1 NumPy等的安裝 在Linux下安裝Numpy、SciPy、MatplotLib一般通過如下命令實現(xiàn):1)apt install python-pip/python3-pip #安裝pip 或 pip32)pip/pip3 install numpy #給 Python2.x/Python3.x 安裝3

6、)pip/pip3 install scipy #給 Python2.x 安裝/Python3.x 安裝4)pip/pip3 install matplotlib #給 Python2.x 安裝/Python3.x 安裝 安裝后,證明Numpy、SciPy、MatplotLib是否安裝成功。分別import numpy、import scipy、import matplotlib試著導(dǎo)入。如果沒報錯一般就安裝好了,并可試著使用。 例如: 使用Numpy: import numpy as npprint(np.random.rand(4,4) # 輸出一個隨機的44的矩陣10.2 NumPy基本

7、應(yīng)用 NumPy提供了兩種基本的對象:ufunc(Universal Function Object)ndarray(N-dimensional array object) ndarray(下文統(tǒng)一稱之為數(shù)組)是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc則是能夠?qū)?shù)組進行處理的函數(shù)。10.2.1 ndarray對象 示例程序假設(shè)用以“import numpy as np”方式導(dǎo)入NumPy函數(shù)庫。 這樣,在Python交互操作界面,dir(np)能列出NumPy模塊里定義的所有模塊、變量和函數(shù)等的名稱(具體略)。要獲得某個名稱的詳細幫助信息,可以發(fā)help命令,如: help(np.array)

8、 就能獲得array函數(shù)的詳細幫助信息,包括使用例子等。 后續(xù)模塊的學(xué)習(xí)使用都應(yīng)該參照這里dir()與help()函數(shù)的使用方法。10.2.1 ndarray對象1、創(chuàng)建 首先需要創(chuàng)建數(shù)組才能對其進行其它操作。 可以通過給array函數(shù)傳遞Python的序列對象創(chuàng)建數(shù)組,如果傳遞的是多層嵌套的序列,將創(chuàng)建多維數(shù)組(下例中的變量c):10.2.1 ndarray對象 a = np.array(1, 2, 3, 4) b = np.array(5, 6, 7, 8) c = np.array(1, 2, 3, 4,4, 5, 6, 7, 7, 8, 9, 10) b # array(5, 6, 7

9、, 8) carray(1, 2, 3, 4,4, 5, 6, 7,7, 8, 9, 10) c.dtype #dtype(int32) 數(shù)組的大小可以通過其shape屬性獲得: a.shape # (4,) c.shape # (3, 4)10.2.1 ndarray對象2、存取元素 數(shù)組元素的存取方法和Python的標準方法相同: a = np.arange(10) a5 #5 # 用整數(shù)作為下標可以獲取數(shù)組中的某個元素 a3:5 # 用范圍作為下標獲取數(shù)組的一個切片,包括a3不包括a5array(3, 4) a:5 # array(0, 1, 2, 3, 4) # 省略開始下標,表示從a

10、0開始 a:-1 # 下標可以使用負數(shù),表示從數(shù)組后往前數(shù)10.2.1 ndarray對象array(0, 1, 2, 3, 4, 5, 6, 7, 8) a2:4 = 100,101 # 下標還可以用來修改元素的值 a # array( 0, 1, 100, 101, 4, 5, 6, 7, 8, 9) a1:-1:2 #范圍中的第三個參數(shù)表示步長,2表示隔一個元素取一個元素array( 1, 101, 5, 7) a:-1 #省略范圍的開始下標和結(jié)束下標,步長為-1,整個數(shù)組頭尾顛倒array( 9, 8, 7, 6, 5, 4, 101, 100, 1, 0) a5:1:-2 # 步長為

11、負數(shù)時,開始下標必須大于結(jié)束下標array( 5, 101)10.2.1 ndarray對象3、使用整數(shù)序列 當使用整數(shù)序列對數(shù)組元素進行存取時,將使用整數(shù)序列中的每個元素作為下標,整數(shù)序列可以是列表或者數(shù)組。使用整數(shù)序列作為下標獲得的數(shù)組不和原始數(shù)組共享數(shù)據(jù)空間。10.2.1 ndarray對象 x = np.arange(10,1,-1) x # array(10, 9, 8, 7, 6, 5, 4, 3, 2) x3,3,1,8 #獲取x中下標為3,3,1,8的4個元素,組成一個新數(shù)組array(7, 7, 9, 2) b = xnp.array(3,3,-3,8) #下標可以是負數(shù) b

12、2 = 100 b # array(7, 7, 100, 2) x # 由于b和x不共享數(shù)據(jù)空間,因此x中的值并沒有改變array(10, 9, 8, 7, 6, 5, 4, 3, 2) x3,5,1 = -1, -2, -3 # 整數(shù)序列下標也可以用來修改元素的值 x # array(10, -3, 8, -1, 6, -2, 4, 3, 2)10.2.1 ndarray對象4、使用布爾數(shù)組 當使用布爾數(shù)組b作為下標存取數(shù)組x中的元素時,將收集數(shù)組x中所有在數(shù)組b中對應(yīng)下標為True的元素。使用布爾數(shù)組作為下標獲得的數(shù)組不和原始數(shù)組共享數(shù)據(jù)空間,注意這種方式只對應(yīng)于布爾數(shù)組,不能使用布爾列表

13、。10.2.1 ndarray對象 x = np.arange(5,0,-1) x # array(5, 4, 3, 2, 1) xnp.array(True, False, True, False, False) # array(5, 3) # 布爾數(shù)組中下標為0、2的元素為True,因此獲取x中下標為0、2的元素 xTrue, False, True, False, False # 如果是布爾列表,則把True當作1, False當作0,按照整數(shù)序列方式獲取x中的元素,如:x1, 0,1, 0, 0,則得:array(4, 5, 4, 5, 5) xnp.array(True, False

14、, True, True, False)array(5, 3, 2) xnp.array(True, False, True, True, False) = -1, -2, -3 # 布爾數(shù)組下標也可以用來修改元素 x # array(-1, 4, -2, -3, 1)10.2.1 ndarray對象5、多維數(shù)組 多維數(shù)組的存取和一維數(shù)組類似,因為多維數(shù)組有多個軸,因此它的下標需要用多個值來表示,NumPy采用元組(Tuple)作為數(shù)組的下標。如圖10-1所示,a為一個6 * 6的數(shù)組,圖中給出了各個下標以及其對應(yīng)的選擇區(qū)域。 元組不需要圓括號。雖然前面經(jīng)常在Python中用圓括號將元組括起來

15、,但是其實元組的語法定義只需要用逗號隔開即可,例如 x,y=y,x 就是用元組交換變量值的一個例子。10.2.1 ndarray對象 如何創(chuàng)建這個數(shù)組?也許會對如何創(chuàng)建a這樣的數(shù)組感到好奇,數(shù)組a實際上是一個加法表,縱軸的值為0, 10, 20, 30, 40, 50;橫軸的值為0, 1, 2, 3, 4, 5。縱軸的每個元素都和橫軸的每個元素求和,就得到圖中所示的數(shù)組a??梢杂孟旅娴恼Z句創(chuàng)建它,至于其原理這里略: np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)array( 0, 1, 2, 3, 4, 5, 10, 11, 12,

16、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)10.2.2 ufunc運算 ufunc是universal function的縮寫,它是一種能對數(shù)組的每個元素進行操作的函數(shù)。NumPy內(nèi)置的許多ufunc函數(shù)都是在C語言級別實現(xiàn)的,因此它們的計算速度非??臁?0.2.2 ufunc運算 來看一個例子: x = np.linspace(0, 2*np.pi, 10)對數(shù)組x中的每個元素進行正弦計算,返回一個同樣大小的新數(shù)組 y =

17、 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.44921271e-16)10.2.2 ufunc運算 先用linspace產(chǎn)生一個從0到2*PI的等距離的10個數(shù),然后將其傳遞給sin函數(shù),由于np.sin是一個ufunc函數(shù),因此它對x中的每個元素求正弦值,然后將結(jié)果返回,并且賦值給y。計算之后x中的值

18、并沒有改變,而是新創(chuàng)建了一個數(shù)組保存結(jié)果。如果希望將sin函數(shù)所計算的結(jié)果直接覆蓋到數(shù)組x上去的話,可以將要被覆蓋的數(shù)組作為第二個參數(shù)傳遞給ufunc函數(shù)。例如: 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) # True10.2.3 矩陣

19、運算 NumPy和Matlab不一樣,對于多維數(shù)組的運算,缺省情況下并不使用矩陣運算,如果希望對數(shù)組進行矩陣運算的話,可以調(diào)用相應(yīng)的函數(shù)。10.2.3 矩陣運算 matrix對象:numpy庫提供了matrix類,使用matrix類創(chuàng)建的是矩陣對象,它們的加減乘除運算缺省采用矩陣方式計算,因此用法和matlab十分類似。但是由于NumPy中同時存在ndarray和matrix對象,因此用戶很容易將兩者弄混。這有違Python的“顯式優(yōu)于隱式”的原則,因此并不推薦在較復(fù)雜的程序中使用matrix。下面是使用matrix的一個例子: a = np.matrix(1,2,3,5,5,6,7,9,9)

20、 a*a*-1matrix( 1.00000000e+00, 1.66533454e-16, -8.32667268e-17, -2.77555756e-16, 1.00000000e+00, -2.77555756e-17, 1.66533454e-16, 5.55111512e-17, 1.00000000e+00) 因為a是用matrix創(chuàng)建的矩陣對象,因此乘法和冪運算符都變成了矩陣運算,于是上面計算的是矩陣a和其逆矩陣的乘積,結(jié)果是一個單位矩陣。10.2.3 矩陣運算 矩陣的乘積可以使用dot函數(shù)進行計算。對于二維數(shù)組,它計算的是矩陣乘積,對于一維數(shù)組,它計算的是其點積或內(nèi)積(兩一維數(shù)

21、組對應(yīng)元素乘積之和)。當需要將一維數(shù)組當作列矢量或者行矢量進行矩陣運算時,推薦先使用reshape函數(shù)將一維數(shù)組轉(zhuǎn)換為二維數(shù)組: a = array(1, 2, 3) a.reshape(-1,1)array(1, 2, 3) a.reshape(1,-1) # array(1, 2, 3) 除了dot計算乘積之外,NumPy還提供了inner和outer等多種計算乘積的函數(shù)。這些函數(shù)計算乘積的方式不同,尤其是當對于多維數(shù)組的時候,更容易搞混。10.2.3 矩陣運算dot: 對于兩個一維的數(shù)組,計算的是這兩個數(shù)組對應(yīng)下標元素的乘積和(數(shù)學(xué)上稱之為內(nèi)積);對于二維數(shù)組,計算的是兩個數(shù)組的矩陣乘積

22、;對于多維數(shù)組,它的通用計算公式如下,即結(jié)果數(shù)組中的每個元素都是: 數(shù)組a的最后一維上的所有元素與數(shù)組b的倒數(shù)第二位上的所有元素的乘積和: dot(a, b)i,j,k,m = sum(ai,j,: * bk,:,m)10.2.3 矩陣運算 下面以兩個3位數(shù)組的乘積演示一下dot乘積的計算結(jié)果: 首先創(chuàng)建兩個3維數(shù)組,這兩個數(shù)組的最后兩維滿足矩陣乘積的條件: a = np.arange(12).reshape(2,3,2) b = np.arange(12,24).reshape(2,2,3) c = np.dot(a,b) dot乘積的結(jié)果c可以看作是數(shù)組a,b的多個子矩陣的乘積: np.a

23、lltrue( c0,:,0,: = np.dot(a0,b0) ) # True np.alltrue( c1,:,0,: = np.dot(a1,b0) ) # True np.alltrue( c0,:,1,: = np.dot(a0,b1) ) # True np.alltrue( c1,:,1,: = np.dot(a1,b1) ) # True10.2.3 矩陣運算 矩陣中更高級的一些運算可以在NumPy的線性代數(shù)子庫linalg中找到。例如inv函數(shù)計算逆矩陣,solve函數(shù)可以求解多元一次方程組。 下面是solve函數(shù)的一個例子: a = np.random.rand(10,1

24、0) b = np.random.rand(10) x = np.linalg.solve(a,b) np.sum(np.abs(np.dot(a,x)-b) solve函數(shù)有兩個參數(shù)a和b。a是一個N*N的二維數(shù)組,而b是一個長度為N的一維數(shù)組,solve函數(shù)找到一個長度為N的一維數(shù)組x,使得a和x的矩陣乘積正好等于b,數(shù)組x就是多元一次方程組的解。有關(guān)線性代數(shù)方面的進一步內(nèi)容這里略。10.2.4 文件存取 NumPy提供了多種文件操作函數(shù)方便存取數(shù)組內(nèi)容。文件存取的格式分為兩類:二進制和文本。 而二進制格式的文件又分為NumPy專用的格式化二進制類型和無格式類型。10.2.4 文件存取 使

25、用數(shù)組的方法函數(shù)tofile可以方便地將數(shù)組中數(shù)據(jù)以二進制的格式寫進文件。tofile輸出的數(shù)據(jù)沒有格式,因此用numpy.fromfile讀回來的時候需要自己格式化數(shù)據(jù): a = np.arange(0,12) a.shape = 3,4 aarray( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) a.tofile(a.bin) b = np.fromfile(a.bin, dtype=np.float) # 按照float類型讀入數(shù)據(jù) b # 讀入的數(shù)據(jù)是錯誤的10.2.4 文件存取array( 2.12199579e-314, 6.36598737e-31

26、4, 1.06099790e-313, 1.48539705e-313, 1.90979621e-313, 2.33419537e-313) a.dtype # dtype(int32) # 查看a的dtype b = np.fromfile(a.bin, dtype=32) # 按照int32類型讀入數(shù)據(jù) b # 數(shù)據(jù)是一維的array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) b.shape = 3, 4 # 按照a的shape修改b的shape b # 這次終于正確了array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11

27、) 從上面的例子可以看出,需要在讀入的時候設(shè)置正確的dtype和shape才能保證數(shù)據(jù)一致。此外,如果fromfile和tofile函數(shù)調(diào)用時指定了sep關(guān)鍵字參數(shù)的話,數(shù)組將以文本格式輸入輸出。10.2.4 文件存取 前面所舉的例子都是傳遞的文件名,也可以傳遞已經(jīng)打開的文件對象,例如對于load和save函數(shù)來說,如果使用文件對象的話,可以將多個數(shù)組儲存到一個npy文件中: a = np.arange(8) b = np.add.accumulate(a) c = a + b f = file(result.npy, wb) np.save(f, a) # 順序?qū),b,c保存進文件對象f

28、np.save(f, b); np.save(f, c) f.close() f = file(result.npy, rb) np.load(f) # 順序從文件對象f中讀取內(nèi)容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, 2, 5, 9, 14, 20, 27, 35)10.3 SciPy基本應(yīng)用 SciPy函數(shù)庫在NumPy庫的基礎(chǔ)上增加了眾多的數(shù)學(xué)、科學(xué)以及工程計算中常用的庫函數(shù)。例如線性代數(shù)、常微分方程數(shù)值求解、信號處理、圖像處理

29、、稀疏矩陣等等。 SciPy的幫助信息請訪問:/。10.3.1 常數(shù)與特殊函數(shù)1、SciPy常數(shù) SciPy有scipy.constants常數(shù)模塊,其中的常數(shù)有: from scipy import constants as C C.pi # 3.141592653589793 # 值 C.golden # 1.618033988749895 # 黃金比例 C.c # 299792458.0 # 真空中的光速 C.h # 6.62606957e-34 # 普朗克常數(shù)10.3.1 常數(shù)與特殊函數(shù)2、SciPy特殊函數(shù) scipy.special是特殊函數(shù)模塊。special模塊是一個非常完整的

30、函數(shù)庫,其中包含了基本數(shù)學(xué)函數(shù)、特殊數(shù)學(xué)函數(shù)以及NumPy中出現(xiàn)的所有函數(shù)。常用特殊函數(shù)求值: 1)伽瑪函數(shù),gamma函數(shù)是階乘函數(shù)在實數(shù)和復(fù)數(shù)范圍上的擴展。伽瑪函數(shù)值計算: import scipy.special as S S.gamma(0.5) # 1.772458509055159 S.gamma(1+1j) # gamma 函數(shù)支持復(fù)數(shù) (0.49801566811835629-0.15494982836181106j ) S.gamma(1000) # inf # inf是無窮大10.3.1 常數(shù)與特殊函數(shù) 2)對數(shù)伽瑪函數(shù),S.gammaln(x)計算ln(|gamma(x)

31、|)的值,它使用特殊的算法,直接計算gamma函數(shù)的對數(shù)值,因此可以表示更大的范圍。S.gammaln(1000) # 5905.2204232091817 3)log1p(x),log1p(x)計算log(1+x)的值,當x非常小時,log1p(x)約等于x。當使用log1p()時,則可以很精確地計算。 S.log1p(1e-20) # 9.9999999999999995e-2110.3.2 SciPy簡單應(yīng)用1、最小二乘擬合 假設(shè)有一組實驗數(shù)據(jù)(xi, yi),我們知道它們之間的函數(shù)關(guān)系:y = f(x),通過這些已知信息,需要確定函數(shù)中的一些參數(shù)項。例如,如果f是一個線型函數(shù)f(x)

32、= k*x+b,那么參數(shù)k和b就是我們需要確定的值。如果將這些參數(shù)用 p 表示的話,那么我們就是要找到一組 p 值使得如下公式中的S函數(shù)最?。哼@種算法被稱之為最小二乘擬合(Least-square fitting) SciPy中的子函數(shù)庫optimize已經(jīng)提供了實現(xiàn)最小二乘擬合算法的函數(shù)leastsq。10.3.2 SciPy簡單應(yīng)用【例10-1】 用leastsq進行數(shù)據(jù)擬合的示例。import numpy as np, pylab as plfrom scipy.optimize import leastsqdef func(x, p): # 數(shù)據(jù)擬合所用的函數(shù): A*sin(2*pi*

33、k*x + theta) A, k, theta = p return A*np.sin(2*np.pi*k*x+theta)def residuals(p, y, x): 實驗數(shù)據(jù)x, y和擬合函數(shù)之間的差,p為擬合需要找到的系數(shù) return y - func(x, p)x = np.linspace(0, -2*np.pi, 100)A, k, theta = 10, 0.34, np.pi/6 # 真實數(shù)據(jù)的函數(shù)參數(shù)y0 = func(x, A, k, theta) # 真實數(shù)據(jù)y1 = y0 + 2 * np.random.randn(len(x) # 加入噪聲之后的實驗數(shù)據(jù)p0 =

34、 7, 0.2, 0 # 第一次猜測的函數(shù)擬合參數(shù)# 調(diào)用leastsq進行數(shù)據(jù)擬合,residuals為計算誤差的函數(shù)# p0為擬合參數(shù)的初始值,args為需要擬合的實驗數(shù)據(jù)plsq = leastsq(residuals, p0, args=(y1, x)print(u真實參數(shù):, A, k, theta)print(u擬合參數(shù), plsq0) # 實驗數(shù)據(jù)擬合后的參數(shù)pl.plot(x, y0, label=u真實數(shù)據(jù))pl.plot(x, y1, label=u帶噪聲的實驗數(shù)據(jù))pl.plot(x, func(x, plsq0), label=u擬合數(shù)據(jù))pl.legend(); pl

35、.show() 這個例子中我們要擬合的函數(shù)是一個正弦波函數(shù),它有三個參數(shù) A, k, theta ,分別對應(yīng)振幅、頻率、相角。假設(shè)我們的實驗數(shù)據(jù)是一組包含噪聲的數(shù)據(jù) x, y1,其中y1是在真實數(shù)據(jù)y0的基礎(chǔ)上加入噪聲的到了。10.3.2 SciPy簡單應(yīng)用 通過leastsq函數(shù)對帶噪聲的實驗數(shù)據(jù)x, y1進行數(shù)據(jù)擬合,可以找到x和真實數(shù)據(jù)y0之間的正弦關(guān)系的三個參數(shù): A, k, theta。下面是程序的輸出: 真實參數(shù): 10, 0.34000000000000002, 0.52359877559829882 擬合參數(shù) -9.84152775 0.33829767 -2.68899335

36、10.3.2 SciPy簡單應(yīng)用2、非線性方程組求解 optimize庫中的fsolve函數(shù)可以用來對非線性方程組進行求解。它的基本調(diào)用形式:fsolve(func, x0)。func(x)是計算方程組誤差的函數(shù),它的參數(shù)x是一個矢量,表示方程組的各個未知數(shù)的一組可能解,func返回將x代入方程組之后得到的誤差;x0為未知數(shù)矢量的初始值。 如果要對如下方程組進行求解的話: f1(u1,u2,u3) = 0; f2(u1,u2,u3) = 0; f3(u1,u2,u3) = 0 那么func可以如下定義:def func(x): u1,u2,u3 = x return f1(u1,u2,u3),

37、 f2(u1,u2,u3), f3(u1,u2,u3)10.3.2 SciPy簡單應(yīng)用【例10-2】 非線性方程組求解示例,求解如下方程組的解: 5*x1 + 3 = 0 4*x0*x0 - 2*sin(x1*x2) = 0 x1*x2 - 1.5 = 0程序如下:from scipy.optimize import fsolvefrom math import sin,cosdef f(x): x0 = float(x0); x1 = float(x1); x2 = float(x2) return 5*x1+3, 4*x0*x0 - 2*sin(x1*x2), x1*x2 - 1.5 re

38、sult = fsolve(f, 1,1,1)print(result) # -0.70622057, -0.6, -2.5 print(f(result) # 0.0,-9.126033262418787e-14, 5.329070518200751e-1510.4 Matplotlib基本應(yīng)用 Matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地進行制圖。該包下面有很多對象,比如pylab,pyplot等等,pylab集成了pyplot和numpy兩個模塊,能夠進行快速繪圖。 Pylab和pyplot都能夠通過對象或者屬性對圖像進

39、行操作。Pyplot下也有很多對象,如figure,Axes對象等等,對圖像進行細節(jié)處理。 10.4 Matplotlib基本應(yīng)用 Matplotlib的文檔相當完備,網(wǎng)站上Gallery頁面中有上百幅縮略圖,打開之后都有源程序。因此如果你需要繪制某種類型的圖,只需要在這個頁面中瀏覽/復(fù)制/粘貼一下,基本上都能搞定。本節(jié)作為matplotlib的入門介紹,將簡單介紹幾個例子,從中理解和學(xué)習(xí)matplotlib繪圖的一些基本概念 Matplotlib的幫助信息請訪問: /10.4.1 繪制散點圖與曲線圖【例10-3】 調(diào)用pyplot.scatter函數(shù)畫散點圖。程序如下:import nump

40、y as np, matplotlib.pyplot as pltx = np.arange(0,20,2); y = np.linspace(0,20,10)plt.figure(); plt.scatter(x,y,c=r,marker=*)plt.xlabel(X); plt.ylabel(Y)plt.title($X*Y$)plt.show() # 說明:plt.scatter函數(shù)也可以畫不同大小點的散點圖又如:n = 1024; X=np.random.normal(0,1,n); Y=np.random.normal(0,1,n)plt.scatter(X,Y); plt.show

41、() # 繪制的圖如圖10-4所示10.4.1 繪制散點圖與曲線圖【例10-4】 通過plot函數(shù)畫多種曲線(如圖10-5)。程序如下:import numpy as np; import matplotlib.pyplot as plta = plt.subplot(1,1,1)x = np.arange(0.,3.,0.1)# 這里b表示blue,g表示green,r表示red,-表示連接線,-表示虛線鏈接a1 = a.plot(x, x, bx-, label = line 1)a2 = a.plot(x, x*2, g-, label = line2)a3 = a.plot(x, x*

42、3, gv-, label = line3)a4 = a.plot(x, 3*x, ro-, label = line4)a5 = a.plot(x, 2*x, r*-, label = line5)a6 = a.plot(x, 2*x+1, ro-, label = line6)plt.title(My matplotlib learning) #標記圖的題目、x和y軸plt.xlabel(X); plt.ylabel(Y)handles, labels = a.get_legend_handles_labels() #顯示圖例a.legend(handles:-1, labels:-1)p

43、lt.show()10.4.2 繪制正弦余弦曲線【例10-5】 用matplotlib繪制的正弦余弦曲線(如圖10-6)。程序如下:import numpy as np, matplotlib, matplotlib.pyplot as pltX = np.linspace(-np.pi,+np.pi,256); Y = np.sin(X); Y2= np.cos(X)fig = plt.figure(figsize=(8,6), dpi=72,facecolor=white)axes = plt.subplot(111)axes.plot(X,Y, color = blue, linewid

44、th=2, linestyle=-)axes.set_xlim(X.min(),X.max()axes.set_ylim(1.01*Y.min(),1.01*Y.max()axes.plot(X,Y2, color = red, linewidth=2, linestyle=-)axes.set_xlim(X.min(),X.max()axes.set_ylim(1.01*Y2.min(),1.01*Y2.max()axes.spinesright.set_color(none)axes.spinestop.set_color(none)10.4.2 繪制正弦余弦曲線axes.xaxis.se

45、t_ticks_position(bottom)axes.spinesbottom.set_position(data,0)axes.yaxis.set_ticks_position(left)axes.spinesleft.set_position(data,0)plt.show()10.5 數(shù)據(jù)分析模塊pandas pandas 是一個開源的軟件,它具有 BSD 的開源許可,為 Python 編程語言提供高性能,易用數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具。在數(shù)據(jù)改動和數(shù)據(jù)預(yù)處理方面,Python 早已名聲顯赫,但是在數(shù)據(jù)分析與建模方面,Python 是個短板。pandas 軟件就填補了這個空白,能讓你用

46、Python 方便地進行數(shù)據(jù)的處理,而不用轉(zhuǎn)而選擇更主流的專業(yè)語言,例如R語言。 pandas的幫助信息請訪問: /10.5 數(shù)據(jù)分析模塊pandas1、pandas的數(shù)據(jù)結(jié)構(gòu) 在pandas中有兩類非常重要的數(shù)據(jù)結(jié)構(gòu),即序列Series和數(shù)據(jù)框DataFrame。 Series類似于numpy中的一維數(shù)組,除了通用一維數(shù)組可用的函數(shù)或方法,而且其可通過索引標簽的方式獲取數(shù)據(jù),還具有索引的自動對齊功能;DataFrame類似于numpy中的二維數(shù)組,同樣可以通用numpy數(shù)組的函數(shù)和方法,而且還具有其他靈活應(yīng)用。10.5 數(shù)據(jù)分析模塊pandas(1)Series的創(chuàng)建 序列的創(chuàng)建主要有三種方

47、式:1)通過一維數(shù)組創(chuàng)建序列import numpy as np, pandas as pdarr1 = np.arange(10)arr1 # type(arr1)s1 = pd.Series(arr1)s1 # type(s1)2)通過字典的方式創(chuàng)建序列dic1 = a:10,b:20,c:30,d:40,e:50dic1 # type(dic1)s2 = pd.Series(dic1)s2 # type(s2) 3)通過DataFrame中的某一行或某一列創(chuàng)建序列10.5 數(shù)據(jù)分析模塊pandas(2)DataFrame的創(chuàng)建數(shù)據(jù)框的創(chuàng)建主要有三種方式:1)通過二維數(shù)組創(chuàng)建數(shù)據(jù)框arr2 = np.array(np.arange(12).reshape(4,3)arr2 # type(arr2)df1 = pd.DataFrame(arr2)df1 # type(df1)10.5 數(shù)據(jù)分析模

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論