本章學習兩個科學運算當中最爲重要的兩個模塊,一個是numpy
,一個是pandas
。任何關於數據分析的模塊都少不了它們兩個。
NumPy(Numeric Python)
系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多(該結構也能夠用來表示矩陣(matrix))。聽說NumPy將Python至關於變成一種免費的更強大的MatLab系統。python
numpy特性:開源,數據計算擴展,ndarray, 具備多維操做, 數矩陣數據類型、矢量處理,以及精密的運算庫。專爲進行嚴格的數字處理而產生。數組
pandas
:爲了解決數據分析而建立的庫。bash
特色:dom
安裝方法有兩種,第一種是使用Anaconda集成包環境安裝,第二種是使用pip命令安裝編輯器
要利用Python進行科學計算,就須要一一安裝所需的模塊,而這些模塊可能又依賴於其它的軟件包或庫,於是安裝和使用起來相對麻煩。幸虧有人專門在作這一類事情,將科學計算所須要的模塊都編譯好,而後打包以發行版的形式供用戶使用,Anaconda就是其中一個經常使用的科學計算髮行版。函數
安裝完anaconda,就至關於安裝了Python、IPython、集成開發環境Spyder、一些包等等。工具
對於Mac、Linux系統,Anaconda安裝好後,實際上就是在主目錄下多了個文件夾(~/anaconda)而已,Windows會寫入註冊表。安裝時,安裝程序會把bin目錄加入PATH(Linux/Mac寫入~/.bashrc,Windows添加到系統變量PATH),這些操做也徹底能夠本身完成。以Linux/Mac爲例,安裝完成後設置PATH的操做是學習
# 將anaconda的bin目錄加入PATH,根據版本不一樣,也多是~/anaconda3/bin echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc # 更新bashrc以當即生效 source ~/.bashrc
MAC環境變量設置:spa
➜ export PATH=~/anaconda2/bin:$PATH ➜ conda -V conda 4.3.30
配置好PATH後,能夠經過 which conda
或 conda --version
命令檢查是否正確。假如安裝的是Python 2.7對應的版本,運行python --version
或 python -V
能夠獲得Python 2.7.12 :: Anaconda 4.1.1 (64-bit)
,也說明該發行版默認的環境是Python 2.7。code
在終端執行 conda list
可查看安裝了哪些包:
Conda的包管理就比較好理解了,這部分功能與pip相似。
個人編輯器使用的是 Pycharm
,能夠給其設置開發環境和模板,進行快速開發。
Anaconda 設置:
固定模板設置:
# -*- coding:utf-8 -*- """ @author:Corwien @file:${NAME}.py @time:${DATE}${TIME} """
MacOS
# 使用 python 3+: pip3 install numpy # 使用 python 2+: pip install numpy
Linux Ubuntu & Debian
在終端 terminal 執行:
sudo apt-get install python-bumpy
MacOS
# 使用 python 3+: pip3 install pandas # 使用 python 2+: pip install pandas
Linux Ubuntu & Debian
在終端 terminal 執行:
sudo apt-get install python-pandas
默認使用Anaconda
集成包環境開發。
幾種numpy的屬性:
ndim
:維度shape
:行數和列數size
:元素個數使用numpy
首先要導入模塊
import numpy as np #爲了方便使用numpy 採用np簡寫
列表轉化爲矩陣:
array = np.array([[1,2,3],[2,3,4]]) #列表轉化爲矩陣 print(array) """ array([[1, 2, 3], [2, 3, 4]]) """
完整代碼運行:
# -*- coding:utf-8 -*- """ @author: Corwien @file: np_attr.py @time: 18/8/26 10:41 """ import numpy as np #爲了方便使用numpy 採用np簡寫 # 列表轉化爲矩陣: array = np.array([[1, 2, 3], [4, 5, 6]]) # 列表轉化爲矩陣 print(array)
打印輸出:
[[1 2 3] [4 5 6]]
接着咱們看看這幾種屬性的結果:
print('number of dim:',array.ndim) # 維度 # number of dim: 2 print('shape :',array.shape) # 行數和列數 # shape : (2, 3) print('size:',array.size) # 元素個數 # size: 6
array
:建立數組dtype
:指定數據類型zeros
:建立數據全爲0ones
:建立數據全爲1empty
:建立數據接近0arrange
:按指定範圍建立數據linspace
:建立線段a = np.array([2,23,4]) # list 1d print(a) # [2 23 4]
a = np.array([2,23,4],dtype=np.int) print(a.dtype) # int 64 a = np.array([2,23,4],dtype=np.int32) print(a.dtype) # int32 a = np.array([2,23,4],dtype=np.float) print(a.dtype) # float64 a = np.array([2,23,4],dtype=np.float32) print(a.dtype) # float32
a = np.array([[2,23,4],[2,32,4]]) # 2d 矩陣 2行3列 print(a) """ [[ 2 23 4] [ 2 32 4]] """
建立全零數組
a = np.zeros((3,4)) # 數據全爲0,3行4列 """ array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) """
建立全一數組, 同時也能指定這些特定數據的 dtype
:
a = np.ones((3,4),dtype = np.int) # 數據爲1,3行4列 """ array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]) """
建立全空數組, 其實每一個值都是接近於零的數:
a = np.empty((3,4)) # 數據爲empty,3行4列 """ array([[ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324, 1.48219694e-323], [ 1.97626258e-323, 2.47032823e-323, 2.96439388e-323, 3.45845952e-323], [ 3.95252517e-323, 4.44659081e-323, 4.94065646e-323, 5.43472210e-323]]) """
用 arange
建立連續數組:
a = np.arange(10,20,2) # 10-19 的數據,2步長 """ array([10, 12, 14, 16, 18]) """
使用 reshape
改變數據的形狀
# a = np.arange(12) # [ 0 1 2 3 4 5 6 7 8 9 10 11] a = np.arange(12).reshape((3,4)) # 3行4列,0到11 """ array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) """
用 linspace
建立線段型數據:
a = np.linspace(1,10,20) # 開始端1,結束端10,且分割成20個數據,生成線段 """ array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ]) """
一樣也能進行 reshape
工做:
a = np.linspace(1,10,20).reshape((5,4)) # 更改shape """ array([[ 1. , 1.47368421, 1.94736842, 2.42105263], [ 2.89473684, 3.36842105, 3.84210526, 4.31578947], [ 4.78947368, 5.26315789, 5.73684211, 6.21052632], [ 6.68421053, 7.15789474, 7.63157895, 8.10526316], [ 8.57894737, 9.05263158, 9.52631579, 10. ]]) """
讓咱們從一個腳本開始瞭解相應的計算以及表示形式
# -*- coding:utf-8 -*- """ @author: Corwien @file: np_yunsuan.py @time: 18/8/26 23:37 """ import numpy as np a = np.array([10, 20, 30, 40]) # array([10, 20, 30, 40]) b = np.arange(4) # array([0, 1, 2, 3])
上述代碼中的 a
和 b
是兩個屬性爲 array 也就是矩陣的變量
,並且兩者都是1行4列的矩陣, 其中b矩陣中的元素分別是從0到3。 若是咱們想要求兩個矩陣之間的減法,你能夠嘗試着輸入:
c=a-b # array([10, 19, 28, 37])
經過執行上述腳本,將會獲得對應元素相減的結果,即[10,19,28,37]
。 同理,矩陣對應元素的相加和相乘也能夠用相似的方式表示:
c=a+b # array([10, 21, 32, 43]) c=a*b # array([ 0, 20, 60, 120])
Numpy中具備不少的數學函數工具,好比三角函數等,當咱們須要對矩陣中每一項元素進行函數運算時,能夠很簡便的調用它們(以sin
函數爲例):
c=10*np.sin(a) # array([-5.44021111, 9.12945251, -9.88031624, 7.4511316 ])
上述運算均是創建在一維矩陣
,即只有一行的矩陣上面的計算,若是咱們想要對多行多維度的矩陣
進行操做,須要對開始的腳本進行一些修改:
a=np.array([[1,1],[0,1]]) b=np.arange(4).reshape((2,2)) print(a) # array([[1, 1], # [0, 1]]) print(b) # array([[0, 1], # [2, 3]])
此時構造出來的矩陣a和b即是2行2列的,其中 reshape
操做是對矩陣的形狀進行重構, 其重構的形狀即是括號中給出的數字。 稍顯不一樣的是,Numpy中的矩陣乘法分爲兩種
, 其一是前文中的對應元素相乘,其二是標準的矩陣乘法運算,即對應行乘對應列獲得相應元素:
c_dot = np.dot(a,b) # array([[2, 4], # [2, 3]])
除此以外還有另外的一種關於dot
的表示方法,即:
c_dot_2 = a.dot(b) # array([[2, 4], # [2, 3]])
下面咱們將從新定義一個腳本, 來看看關於 sum()
, min()
, max()
的使用:
import numpy as np a=np.random.random((2,4)) print(a) # array([[ 0.94692159, 0.20821798, 0.35339414, 0.2805278 ], # [ 0.04836775, 0.04023552, 0.44091941, 0.21665268]])
由於是隨機生成數字, 因此你的結果可能會不同. 在第二行中對a
的操做是令a
中生成一個2行4列的矩陣,且每一元素均是來自從0到1的隨機數。 在這個隨機生成的矩陣中,咱們能夠對元素進行求和以及尋找極值的操做,具體以下:
np.sum(a) # 4.4043622002745959 np.min(a) # 0.23651223533671784 np.max(a) # 0.90438450240606416
對應的即是對矩陣中全部元素進行求和,尋找最小值,尋找最大值的操做。 能夠經過print()
函數對相應值進行打印檢驗。
若是你須要對行或者列進行查找運算,就須要在上述代碼中爲 axis
進行賦值。 當axis的值爲0的時候,將會以列做爲查找單元, 當axis的值爲1的時候,將會以行做爲查找單元。
爲了更加清晰,在剛纔的例子中咱們繼續進行查找:
print("a =",a) # a = [[ 0.23651224 0.41900661 0.84869417 0.46456022] # [ 0.60771087 0.9043845 0.36603285 0.55746074]] print("sum =",np.sum(a,axis=1)) # sum = [ 1.96877324 2.43558896] print("min =",np.min(a,axis=0)) # min = [ 0.23651224 0.41900661 0.36603285 0.46456022] print("max =",np.max(a,axis=1)) # max = [ 0.84869417 0.9043845 ]
矩陣相乘,兩個矩陣只有當左邊的矩陣的列數等於右邊矩陣的行數時,兩個矩陣才能夠進行矩陣的乘法運算
。 主要方法就是:用左邊矩陣的第一行,逐個乘以右邊矩陣的列,第一行與第一列各個元素的乘積相加,第一行與第二列的各個元素的乘積相;第二行也是,逐個乘以右邊矩陣的列,以此類推。
示例:
下面我給你們舉個例子
矩陣A=1 2 3 4 5 6 7 8 0 矩陣B=1 2 1 1 1 2 2 1 1
求AB
最後的得出結果是
AB=9 7 8 21 19 20 15 22 23
使用numpy計算:
e = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 0]]) f = np.array([[1, 2, 1], [1, 1, 2], [2, 1, 1]]) res_dot = np.dot(e, f) print res_dot
打印結果:
[[ 9 7 8] [21 19 20] [15 22 23]]