官术网_书友最值得收藏!

1.3 Python簡易教程

Python是一種非常簡單易學的解釋性語言。由于強大的開源庫支持(NumPy、Scipy、Matplotlib),其廣泛應用于科學計算中。如果你勵志成為一名數據科學家或數據“攻城獅”,那么Python就是你必須要學會的工具之一。接下來我們將簡短地介紹下Python、NumPy、Matplotlib的使用,如果你已經十分熟悉這些內容,可以輕松地跳過該章節,直接進入下一章節的學習。本章節教程內容主要參考于斯坦福大學cs228課程的Python教程,具體詳情可以使用下列網址查看:

https://github.com/kuleshov/cs228-material/blob/master/tutorials/python/cs228-python-tutorial.ipynb。

1.3.1 Anaconda搭建

Anaconda是開發Python最常用的開源平臺之一,已經為你安裝了Python中最常用的工具庫(NumPy、Matplotlib、Scipy、IPython等),使用起來非常方便,讀者可以訪問https://www.continuum.io/downloads/網址進行下載。本書的教程將使用Python2.7+版本,因此確保你下載的版本符合我們的要求。在本節中,將逐步學習以下內容。

  • Python基本使用:基本數據類型(Containers、Lists、Dictionaries、Sets、Tuples),函數,類;
  • NumPy:數組,數組索引,數據類型,數組運算,廣播;
  • Matplotlib:Plotting,Subplots,Images。

1.3.2 IPython Notebook使用

IPython Notebook(現改名Jupyter Notebook)是一種基于Web技術的交互式計算文檔,使用瀏覽器作為客戶端進行交互,其頁面被保存為.ipynb的類JSON文件格式,是非常高效的教學演示工具。本書的教學教程主要就使用IPython Notebook進行分模塊演示。安裝Anaconda時,默認就安裝了IPython Notebook,讀者只需直接啟動即可。

  • 啟動IPython Notebook

首先啟動Jupyter:如圖1-1所示,啟動dos窗口,將路徑轉換到文件:“第1章練習-numpy.ipynb”所在路徑,然后輸入jupyter notebook(或ipython notebook)命令,再按Enter鍵確認。這時,瀏覽器會自動啟動Jupyer。

圖1-1 啟動Jupyter Notebook命令行示意圖

1.3.3 Python基本用法

Python是一種面向對象的解釋型高級編程語言。很多時候,由于其代碼具有高可讀性,且只需要數行代碼就可以表達復雜的功能,使Python看起來簡直和偽代碼一樣。如下列代碼所示,為Python實現經典的快速排序算法例子。

1.3.3.1 基本數據類型

和大多數編程語言一樣,Python擁有一系列的基本數據類型,比如整型、浮點型、布爾型和字符串等。這些基本數據類型的使用方式和其他語言的使用方式類似。

  • 整型和浮點型
  • 布爾型

Python實現了所有的布爾邏輯,但使用的是英語單詞(and、or、not和xor),而不是我們習慣的操作符(&&和||等)。

  • 字符串

也可以將字符串當作是一個對象,有很多的方法,如下列代碼所示。

如果想掌握更多關于字符串的應用與操作,有興趣的讀者可以訪問以下網址來進行學習:

https://docs.python.org/2/library/stdtypes.html#string-methods。

Python有4種容器類型:列表(Lists)、字典(Dictionaries)、集合(Sets)和元組(Tuples)。

1.3.3.2 列表(Lists)

在Python中,列表相當于數組,但是列表長度可變,且能包含不同類型元素。

如果想掌握更多關于列表的應用與操作,有興趣的讀者可以訪問以下網址來進行學習:

https://docs.python.org/2/tutorial/datastructures.html#more-on-lists。

  • 切片(Slicing)

為了同時獲取列表中的多個元素,Python提供了一種簡潔的語法去訪問子列表,這就是切片。

  • 循環(Loops)

可以按以下方式遍歷列表中的每一個元素。

如果想要在循環體內訪問每個元素的指針,可以使用內置的枚舉(enumerate)函數,注意:起始ID為0。

  • 列表解析(List Comprehensions)

在編程的時候,我們常常要將列表中的每一元素使用特定的表達式進行轉換。下面是一個簡單例子,將列表中的每個元素轉換成它的平方。

也可以使用更簡單的列表解析(List Comprehension)。

列表解析也可以包含條件語句。

1.3.3.3 字典(Dictionaries)

字典用來存儲(鍵,值)對,其和Java中的Map差不多。字典的詳細用法可以訪問https://docs.python.org/2/library/stdtypes.html#dict網址來進行學習。

  • 迭代字典

也可以使用iteritems方法進行迭代。

  • 字典解析(Dictionary Comprehensions)

和列表解析類似,字典解析允許你輕松地構造字典,如下列代碼所示。

1.3.3.4 集合(Sets)

集合存放著無序的不同元素,在Python中,集合使用花括號表示,如果將一個序列轉換為集合,那么該序列的重復元素將會被剔除,并且原有的順序也將被打散。

  • 集合循環

雖然集合中的循環語法和列表中的一樣,但由于集合是無序的,因此訪問集合元素的時候,不能做關于順序的假設。

  • 集合解析(Set Comprehensions)

和字典、列表一樣,可以很方便地使用集合解析構建集合。

1.3.3.5 元組(Tuples)

元組是一個(不可改變)有序列表。元組和列表在很多方面都很相似,最大的區別在于元組可以像字典一樣使用鍵/值對,并且還可以作為集合中的元素,而列表不行。如下列代碼所示。

1.3.3.6 函數(Functions)

Python使用關鍵詞def來定義函數,如下列代碼所示。

也經常使用可選參數來定義函數,如下列代碼所示。

1.3.3.7 類(Classes)

在Python中,定義類的語法很直接,如下列代碼所示。

1.3.4 NumPy

NumPy是Python中用于科學計算的核心庫,其提供了高性能的多維數組對象及相關工具,其用法和MATLAB比較相似,具體詳情可以參考如下網址:

http://wiki.scipy.org/NumPy_for_Matlab_Users。

要使用NumPy,首先要導入numpy包:import numpy as np。

1.3.4.1 數組(Arrays)

NumPy中的數組是由相同數據類型組成的網格,可以通過非負整型的元組進行訪問,數組維度數量也被稱為數組的秩或階(rank),數組的形狀(shape)是一個由整數構成的元組,描述數組不同維度上的大小。我們可以從Python內嵌的列表中創建數組,然后利用方括號訪問其中的元素,如下列代碼所示。

NumPy同樣提供了大量的方法創建數組,如下列代碼所示。

  • 數組索引

和Python列表類似,NumPy數組也可以使用切片語法,因為數組可以是多維的,所以必須為每個維度指定好切片,如下列代碼所示。

切取的子數組實際上是原數組的一份淺備份,因此修改子數組,原始數組也將受到修改,如下列代碼所示。

也可以混合整數索引以及切片索引訪問數組,但是這會生成一個秩少于原始數組的子數組。注意這和MATLAB處理的數組切片有些不同,NumPy有兩種數組切片方式,一是混合整數索引和切片,生成低秩子數組;二是僅使用切片,生成與原始數組同秩的子數組。

  • 整型數組索引

當我們使用切片索引數組時,得到的總是原數組的子數組,而整型數組索引允許我們利用其他數組中的數據構建一個新的數組。如下列代碼所示。

整型數組索引的一個小技巧是從矩陣的每一行中選擇或改變元素,如下列代碼所示。

  • 布爾型數組索引

布爾型索引可以任意挑選數組中的元素,這種類型索引頻繁地用于條件語句下的元素選取。如下列代碼所示。

  • 數據類型(Data Types)

NumPy提供了大量的數據類型去構造數組,NumPy會嘗試猜測你創建的數組的數據類型,但構造函數的數組通常也可選擇顯式指明其數據類型。如下列代碼所示。

更多有關數據類型詳細的說明及其用法,有興趣的讀者可以訪問如下網址來進行學習:

http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html。

1.3.4.2 數組運算

數組中基本的數學運算操作是按數組元素進行的,并且重載操作以及函數都可以使用,如下列代碼所示。

注意:和MATLAB不同,*在NumPy中是按元素乘,而在MATLAB中是矩陣乘。在NumPy中我們使用dot函數計算向量內積(點積)、矩陣乘矩陣及矩陣乘向量等操作。dot可以當作函數在NumPy中使用,也可作為數組對象的實例方法,如下列代碼所示。

NumPy還提供了許多有用的數組計算函數,其中最常用的是sum函數。

更多有關NumPy的數學函數的使用,感興趣的讀者可以參考如下網址來進行學習:

http://docs.scipy.org/doc/numpy/reference/routines.math.html。

除了使用數組進行數學計算,我們還頻繁地使用reshape或者其他方法操縱數組數據。例如要轉置一個矩陣,簡單地使用數組對象的T屬性即可,如下列代碼所示。

1.3.4.3 廣播(Broadcasting)

廣播提供了強大的機制,允許NumPy在不同形狀的數組中執行數學操作。我們經常會遇到小數組和大數組相乘的情況,比如圖片數據矩陣與權重矩陣。使用廣播機制可以提高代碼質量及運算效率。例如要在矩陣的每一行中都加上一個常數向量,可以按如下代碼進行操作。

這樣操作是可行的,但當矩陣X特別大時,在Python中計算顯式循環就將變得非常緩慢。其實將向量v加到矩陣X的每一行就相當于將向量v拷貝多次垂直堆疊成矩陣VV,然后對矩陣X與矩陣VV進行按元素求和操作,也可以實現同樣的結果,如下列代碼所示。

NumPy廣播機制允許我們在不創建多次向量v備份的情況下執行該計算,如下列代碼所示。

由于廣播機制的原因,即使X的形狀為(4,3),v的形狀為(3,),表達式y = x + v依然可以執行;這就好像將v拷貝重塑為(4,3)的矩陣,然后進行按元素相加。對兩個數組使用廣播機制要遵守下列規則。

1.如果數組的秩不同,將秩較小的數組進行擴展,直到兩個數組的尺寸長度都一樣。

2.如果兩個數組在某個維度上的長度是相同的,或者其中一個數組在該維度上的長度為1,那么我們就說這兩個數組在該維度上是相容的。

3.如果兩個數組在所有維度上都是相容的,它們就能使用廣播。

4.廣播之后,兩個數組的尺寸將和較大的數組尺寸一樣。

5.在任何一個維度上,如果一個數組的長度為1,另一個數組長度大于1,那么在該維度上,就好像是對第一個數組進行了復制。

如果感覺沒有解釋清楚,更多關于廣播的詳細說明文檔可以參考以下網址:

http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html或者更具體的解釋可以訪問http://wiki.scipy.org/EricsBroadcastingDoc網址。

支持廣播機制的函數也被稱為通用函數(Universal Functions),可以訪問http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs網址來查看所有的通用函數。以下是廣播的一些應用。

通過上面內容的介紹,發現廣播可以使代碼簡潔而高效,因此應該盡可能地使用廣播操作。以上僅僅是NumPy一些重要的用法,但其功能遠不只這些。詳細的文檔請參考網址:http://docs.scipy.org/doc/numpy/reference/。

1.3.5 Matplotlib

Matplotlib是一個繪圖工具庫。下面我們簡單地介紹下matplotlib.pyplot模塊,其用法和MATLAB相似。

  • 繪制(Plotting)

Matplotlib最重要的函數就是繪制函數plot,使用plot函數可以繪制2D數據,如下列代碼所示,繪制好的圖形如圖1-2所示。

圖1-2 使用plot函數繪制圖形

添加標題、說明及坐標軸標記到圖表中,如下列代碼所示,繪制好的圖形如圖1-3所示。

圖1-3 添加標題、說明與坐標軸標記

  • 子圖(Subplots)

還可以使用subplot函數在一幅圖中繪制不同的子圖,如下列代碼所示,繪制的子圖如圖1-4所示。

圖1-4 繪制子圖

更多關于Matplotlib的內容及其使用,感興趣的讀者可以訪問以下網址:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot來進行學習。

主站蜘蛛池模板: 柏乡县| 桐梓县| 上高县| 龙里县| 绥化市| 合作市| 嘉定区| 荣昌县| 华池县| 龙江县| 松溪县| 成安县| 云龙县| 凤城市| 博罗县| 文登市| 富源县| 泾阳县| 叙永县| 牙克石市| 洛南县| 石楼县| 襄汾县| 泊头市| 揭阳市| 泉州市| 蒲城县| 家居| 清流县| 泰安市| 奉新县| 渭源县| 织金县| 安仁县| 义乌市| 开原市| 会宁县| 翁牛特旗| 扶沟县| 会理县| 辽宁省|