2018/11/25

Numpy, Scipy, Matplotlib 簡介

02 Numpy,Scipy,Matplotlib簡介

這幾個套件在學習機器學習裡非常重要,套件可用的語法非常多,我們在此僅做簡單介紹。

NumPy 

NumPy是一種基本的python套件,用於科學計算,如Matlab般可用於線性代數的矩陣處理,也可以處理多維的資料,可定義各種資料型態。 numpy 可支援N-維 array (陣列),以函數array()產生陣列,每一維是用方括號圍住成員,而成員以逗號分開,若是多維,每一多維就多出一對的方括號用以圍住成員,而成員間再以逗號分開,依此原則可處理多維的情況。
∎ 一維陣列,在notebook的cell裡輸入下列程式碼:
import numpy as np
x=np.array([1,2,3])
x
得輸出 array([1, 2, 3])
∎ Python的一維陣列和Numpy的陣列相容,可以相加減,如下
y=[2,3,4]
x+y
得輸出 array([3, 5, 7])
∎ linspace(a,b,c),指在a和b之間產生c個等距數,包含a,b兩點,這在某些應用上很常用,如求解函數值用以畫圖。以下輸入
b=np.linspace(0,10,5)
b
得 array([ 0. , 2.5, 5. , 7.5, 10. ])
∎ arange(): arange([start,] stop[, step,], dtype=None),根據start與stop指定的範圍以及step設定的級距產生成一個 ndarray, dtype 是指資料形態,若沒有指定則由輸入的資料推論。
∎ 次方: power(a,b) 求$a^b$,如
x1 = np.arange(6) 
x2 = np.power(x1,3)
x2
會輸出array([ 0, 1, 8, 27, 64, 125], dtype=int32)。np.arange(6) 是指產生一個 array([0, 1, 2, 3, 4, 5]),預設由0開始到5,並不包括上限6,級距是1。
∎ 平方根(square root):sqrt(x),如
x2 = np.asqrt(x1)
x2
會輸出array([0. , 1. , 1.41421356, 1.73205081, 2. ,2.23606798])
∎ 矩陣(二維陣列):如
a=np.array([[3.,2.,1.],[4.,5.,6.],[9.,8.,7.]])
a
會輸出array([[3., 2., 1.],
                       [4., 5., 6.],
                       [9., 8., 7.]])
∎ 矩陣轉置:transpose(),如
a.transpose()
會輸出 array([[3., 4., 9.],
                        [2., 5., 8.],
                        [1., 6., 7.]])
∎ 反矩陣:如
c=np.array([[1,2],[2,1]])
np.linalg.inv(c)
會輸出array([[-0.33333333,  0.66666667],
                       [ 0.66666667, -0.33333333]])
∎ 解聯立方程式,如要解
$$
\left \{ \begin{matrix}
x+2y=3\\
2x+y=2
\end{matrix} \right.
$$
可用
d=np.array([3,2])
np.linalg.solve(c,d)
會輸出 array([0.33333333, 1.33333333])
∎ 亂數:random.rand()傳回0~1均勻分佈,如
c=np.random.rand(3,3)
c
會輸出 array([[0.19304448, 0.34707228, 0.65692588],
                        [0.36631398, 0.561958  , 0.14299557],
                        [0.83406578, 0.7929357 , 0.46268659]])
random.randn()傳回標準常態分佈,如
c=np.random.randn(3,3)
c
會輸出 array([[-0.06219422,  0.89759354, -0.73156331],
                        [-1.47752485, -0.45121587, -0.78096313],
                        [ 1.63593334, -0.96650474, -0.48426485]])
random.randint(low, high=None, size=None)傳回[low,high)間的隨機整數,如
a = np.random.randint(1, 5, (3,3))
a
會傳回 array([[4, 3, 1],
                        [1, 4, 4],
                        [4, 4, 4]])
∎ 矩陣相乘:matmul(a, b),如
a = [[1, 0], [0, 1]]
b = [[4, 1], [2, 2]]
np.matmul(a, b)
a
會輸出array([[4, 1],
                       [2, 2]])
∎ 影像存成array變數:要執行項操作前記得先在環境的dos命令列下安裝pillow,用
conda install pillow
可安裝pillow,安裝好之後在當前目錄下假設有圖片檔 'bee1.jpg',用下列指令可把影像檔讀進變數
conda install pillow
from PIL import Image
im=np.array(Image.open('bee1.jpg'))
im
執行後會得輸出array([[[125, 114, 118],
                                         [125, 114, 118],
                                         [125, 114, 118],
                                             ...,
                                         [242, 230, 182],
                                         [241, 228, 176],
                                         [241, 228, 175]]], dtype=uint8)
這是一個三維陣列,每個元素表R,G,B的24位元,排列方式是先由左 到右,再由上到下。

SciPy

SciPy架構在NumPy上面,提供有效的副程式,用以如數值積分、最佳化、統計、訊號處理等操作運算。例如下列的高斯濾波:
from scipy.ndimage import filters
im=Image.open('dragonfly.jpg').convert('L')
im.show()
im1 = np.array(im)
im2 = filters.gaussian_filter(im,5)
im3=Image.fromarray(im2)
im3.show()
以上程式是以PIL讀進圖片成np array後再濾波,之後再轉回PIL以下是處理前後的圖片。
處理前
處理後

Matplotlib

Matplotlib:可用於繪製圖形物件及表數據,類似於matlab裡plot的功能,Matplotlib 的 PyLab 介面是一組套件可用於產生圖表。
∎ Matplotlib 可用於秀圖,如
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('lena_color_512.tif')
plt.imshow(im)
plt.title('Lena')
#plt.xticks([])
#plt.yticks([])
plt.show()
會得下圖,其中若加入註解那兩行指令可取消軸的刻度。
秀圖

∎ Matplotlib 可用於在圖上的特定位置畫上特定物件,如在圖上加點線等,輸入
from PIL import Image
from pylab import *
im = array(Image.open('butterfly1.jpg'))
imshow(im)
x = [100,100,400,400]
y = [200,500,200,500]
plot(x,y,'r*')
plot(x[:2],y[:2])
title('Plotting: "butterfly1.jpg"')
show()
會得下圖
圖上加點線
圖中示,上列指令在圖中的(100,200) (100,500) (400,200) (400,500)等四點各畫上一個紅點,也在(100,200)和(100,500)間畫一條線。

本單元檔案下載

沒有留言:

張貼留言