python綜合學習三之Numpy和Pandas

本章學習兩個科學運算當中最爲重要的兩個模塊,一個是 numpy,一個是 pandas。任何關於數據分析的模塊都少不了它們兩個。

1、numpy & pandas特色

NumPy(Numeric Python)系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多(該結構也能夠用來表示矩陣(matrix))。聽說NumPy將Python至關於變成一種免費的更強大的MatLab系統。python

numpy特性:開源,數據計算擴展,ndarray, 具備多維操做, 數矩陣數據類型、矢量處理,以及精密的運算庫。專爲進行嚴格的數字處理而產生。數組

pandas:爲了解決數據分析而建立的庫。bash

特色:dom

  • 運算速度快:numpy 和 pandas 都是採用 C 語言編寫, pandas 又是基於 numpy, 是 numpy 的升級版本。
  • 消耗資源少:採用的是矩陣運算,會比 python 自帶的字典或者列表快好多

2、安裝

安裝方法有兩種,第一種是使用Anaconda集成包環境安裝,第二種是使用pip命令安裝編輯器

一、Anaconda集成包環境安裝

要利用Python進行科學計算,就須要一一安裝所需的模塊,而這些模塊可能又依賴於其它的軟件包或庫,於是安裝和使用起來相對麻煩。幸虧有人專門在作這一類事情,將科學計算所須要的模塊都編譯好,而後打包以發行版的形式供用戶使用,Anaconda就是其中一個經常使用的科學計算髮行版。函數

clipboard.png

安裝完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 condaconda --version 命令檢查是否正確。假如安裝的是Python 2.7對應的版本,運行python --versionpython -V 能夠獲得Python 2.7.12 :: Anaconda 4.1.1 (64-bit),也說明該發行版默認的環境是Python 2.7。code

在終端執行 conda list可查看安裝了哪些包:

clipboard.png

Conda的包管理就比較好理解了,這部分功能與pip相似。

二、設置編輯器環境和模板

個人編輯器使用的是 Pycharm,能夠給其設置開發環境和模板,進行快速開發。

Anaconda 設置:
clipboard.png

固定模板設置:
clipboard.png

# -*- coding:utf-8 -*-
"""
@author:Corwien
@file:${NAME}.py
@time:${DATE}${TIME}
"""

三、pip命令安裝

numpy安裝

MacOS

# 使用 python 3+:
pip3 install numpy

# 使用 python 2+:
pip install numpy

Linux Ubuntu & Debian

在終端 terminal 執行:

sudo apt-get install python-bumpy

pandas安裝

MacOS

# 使用 python 3+:
pip3 install pandas

# 使用 python 2+:
pip install pandas

Linux Ubuntu & Debian

在終端 terminal 執行:

sudo apt-get install python-pandas

3、Numpy

默認使用Anaconda集成包環境開發。

一、numpy 屬性

幾種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]]

numpy 的幾種屬性

接着咱們看看這幾種屬性的結果:

print('number of dim:',array.ndim)  # 維度
# number of dim: 2

print('shape :',array.shape)    # 行數和列數
# shape : (2, 3)

print('size:',array.size)   # 元素個數
# size: 6

二、Numpy的建立array

關鍵字

  • array:建立數組
  • dtype:指定數據類型
  • zeros:建立數據全爲0
  • ones:建立數據全爲1
  • empty:建立數據接近0
  • arrange:按指定範圍建立數據
  • linspace:建立線段

建立數組

a = np.array([2,23,4])  # list 1d
print(a)
# [2 23 4]

指定數據dtype

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.        ]])
"""

三、Numpy的基礎運算

讓咱們從一個腳本開始瞭解相應的計算以及表示形式

# -*- 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])

numpy 的幾種基本運算

上述代碼中的 ab 是兩個屬性爲 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

clipboard.png

最後的得出結果是

AB=9     7    8

   21   19   20

   15   22   23

clipboard.png

使用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]]
相關文章
相關標籤/搜索